private void btnReadAuth_Click(object sender, EventArgs e) { if (!int.TryParse(tbFreeSpace.Text, out freeSpace2)) if (MessageBox.Show("Недопустимое значение FreeSpace", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK) { tbFreeSpace.Text = ""; tbFreeSpace.Focus(); return; } if (freeSpace2 <= 0) if (MessageBox.Show("Значение FreeSpace должно быть больше 0", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK) { tbFreeSpace.Text = ""; tbFreeSpace.Focus(); return; } //получение групы блоков G их их координат в изображении object[] obj = Functions.GetBlocks(bm3, colorComponent2); List<byte[,]> listOfG = (List<byte[,]>)obj[0]; List<int[]> listOfGXY = (List<int[]>)obj[1]; // получение группы блоков G1 List<byte[,]> listOfG1 = new List<byte[,]>(listOfG.Count); flipLevel2 = (byte)trackBar2.Value; foreach (byte[,] bl in listOfG) listOfG1.Add(Functions.FlipBlock(bl, flipLevel2)); //получение RSM' вектора //и массива хранящего тип каждого блока(R,S,U) obj = Functions.GetVector(listOfG, listOfG1); bool[] RSM2 = (bool[])obj[0]; bool?[] blockType = (bool?[])obj[1]; try { //расспаковка RSM' - получаем вектор RS оригинала bool[] RSCompressed = (RSM2.Take(RSM2.Length - freeSpace2).ToArray()); byte[] source = Functions.BitsToBytes(RSCompressed); byte[] decompressedData = new byte[source.Length + 1000]; LZF lzf = new LZF(); int g = lzf.Decompress(source, source.Length, decompressedData, decompressedData.Length); byte[] temp = decompressedData.Take(g).ToArray(); bool[] RS = Functions.BytesToBits(temp); //ВЫДЕЛЕНИЕ ХЕШ КОДА И АУТЕНТИФИКАТОРА bool[] hash = new bool[128]; bool[] auth = new bool[freeSpace2 - 128]; int i, c; for (i = RSM2.Length - freeSpace2, c = 0; c < hash.Length; c++, i++) { hash[c] = RSM2[i]; } //переводим хеш в массив байт hashInBytes = new byte[16]; BitArray ba = new BitArray(hash); ba.CopyTo(hashInBytes, 0); for (c = 0; c < auth.Length; c++, i++) { auth[c] = RSM2[i]; } //переводим аутентификатор в строку byte[] authInBytes = new byte[auth.Length / 8 + 1]; ba = new BitArray(auth); ba.CopyTo(authInBytes, 0); tbAuthenticator2.Text = Encoding.Default.GetString(authInBytes); //возвращаем изображение к первоначальному виду bm4 = Functions.GetImage(bm3, colorComponent, listOfG1, listOfGXY, RS, blockType); pictureBox4.Image = bm4; btnIsImgModified.Enabled = btnSave2.Enabled = true; } catch { MessageBox.Show( "Введенное значение freeSpace не может\r\nбыть применимо к данному изображению!\r\nПовторите ввод", "Ошибка", MessageBoxButtons.OK,MessageBoxIcon.Error ); tbFreeSpace.Text = ""; tbFreeSpace.Focus(); return; } tbAuthenticator2.Enabled = true; }
public LzfInputStream(Stream stream) { this.stream = stream; this.lzf = new LZF(); }
async private void btnGetFreeSpace_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; //1 ПОЛУЧЕНИЕ RS-вектора изображения //получение групы блоков G их их координат в изображении object[] obj = await Task<object[]>.Factory.StartNew(()=>Functions.GetBlocks(bm, colorComponent)); listOfG = (List<byte[,]>)obj[0]; listOfGXY = (List<int[]>)obj[1]; // получение группы блоков G1 listOfG1 = new List<byte[,]>(listOfG.Count); flipLevel = (byte)trackBar1.Value; foreach (byte[,] bl in listOfG) listOfG1.Add(await Task<byte[,]>.Factory.StartNew(()=>Functions.FlipBlock(bl, flipLevel))); //получение RS-вектора //и массива хранящего тип каждого блока(R,S,U) obj = await Task<object[]>.Factory.StartNew(()=>Functions.GetVector(listOfG, listOfG1)); bool[] RS = (bool[])obj[0]; blockType = (bool?[])obj[1]; //2 СЖАТИЕ GZip И ПОЛУЧЕНИЕ RS1-ВЕКТОРА //записали в поток сжатые байты LZF lzf = new LZF(); byte[] source = Functions.BitsToBytes(RS); byte[] result = new byte[source.Length + 1000]; int c = lzf.Compress(source, source.Length, result, result.Length); byte[] temp = result.Take(c).ToArray(); RS1 = new BitArray(Functions.BytesToBits(temp)); //рассчет получившегося за счет сжатия свободного места(в битах) freeSpace = RS.Length - RS1.Length; lblFreeSpace.Text = freeSpace + " бит"; symbolCount = freeSpace / 8 - 16;// -16 символов(128 бит) на хеш if (symbolCount <= 0) { MessageBox.Show("В изображение не получится записать ни одного символа!\n" + "Выберите другое изображение или измените настройки"); lblSymbolCount.Text = symbolCount + " символов"; return; } lblSymbolCount.Text = symbolCount + " символов"; btnWrite.Enabled = tbAuthenticator.Enabled = true; Cursor.Current = Cursors.Default; }