//создание случайного изображения public Bitmap CreateRandomImage(int width, int height) { BufferedBitmap bb = new BufferedBitmap(new Bitmap(width, height)); Random r = new Random(); byte color; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { color = (byte)r.Next(0, 255); bb.SetPixel(i, j, Color.FromArgb(color, color, color)); } } bb.Unlock(); return(bb.Bitmap); }
//вычленение блока из изображения public Bitmap SelectBlockFromImage(BufferedBitmap bb, int offsetX, int offsetY, int blockSize) { int x, y; var bbTemp = new BufferedBitmap(new Bitmap(blockSize, blockSize)); x = offsetX * blockSize; for (int xDomain = 0; xDomain < blockSize; xDomain++) { y = offsetY * blockSize; for (int yDomain = 0; yDomain < blockSize; yDomain++) { bbTemp.SetPixel(xDomain, yDomain, bb.GetPixel(x, y)); y++; } x++; } bbTemp.Unlock(); return(bbTemp.Bitmap); }
//декодирование изображения public Bitmap[] Decompress(string path, int numberOfIterations, bool imageFlag) { Stopwatch sw = new Stopwatch(); sw.Restart(); int width, height; var compressedData = ReadData(path, out width, out height); Bitmap[] images = new Bitmap[numberOfIterations]; if (!imageFlag) { try { OpenFileDialog opf = new OpenFileDialog(); if (opf.ShowDialog() == DialogResult.OK) { images[0] = ResizeImage(new Bitmap(opf.FileName), width, height); } } catch (Exception ex) { throw new Exception("Файл не является картинкой"); } } else { images[0] = CreateRandomImage(width, height); } Bitmap image = new Bitmap(images[0]); Bitmap reduced = new Bitmap(ResizeImage(image, width / 2, height / 2)); Bitmap restored = new Bitmap(image); Bitmap temp = new Bitmap(image); var bbOriginal = new BufferedBitmap(image); var bbReduced = new BufferedBitmap(reduced); for (int nb = 1; nb < numberOfIterations; nb++) { for (int i = 0; i < compressedData.GetLength(0); i++) { for (int x = 0; x < compressedData.GetLength(1); x++) { for (int y = 0; y < compressedData.GetLength(2); y++) { var offsetX = (int)compressedData[i, x, y, 0]; var offsetY = (int)compressedData[i, x, y, 1]; var indexRotation = (int)compressedData[i, x, y, 2]; var contrast = compressedData[i, x, y, 3]; var brightness = compressedData[i, x, y, 4]; var domainBlock = SelectBlockFromImage(bbReduced, offsetX, offsetY, Data.RankBlockSize); domainBlock.RotateFlip(rotate[indexRotation]); var bbDomainBlock = new BufferedBitmap(domainBlock); for (int domainX = 0; domainX < Data.RankBlockSize; domainX++) { for (int domainY = 0; domainY < Data.RankBlockSize; domainY++) { double pixel = bbDomainBlock.GetColorOfPixel(domainX, domainY, i); pixel = contrast * pixel + brightness; pixel = Math.Round(pixel); if (pixel < byte.MinValue) { pixel = 0; } if (pixel > byte.MaxValue) { pixel = 255; } if (i == 0) { bbOriginal.SetPixel(x * Data.RankBlockSize + domainX, y * Data.RankBlockSize + domainY, Color.FromArgb((int)pixel, (int)pixel, (int)pixel)); continue; } var color = temp.GetPixel(x * Data.RankBlockSize + domainX, y * Data.RankBlockSize + domainY); if (i == 1) { bbOriginal.SetPixel(x * Data.RankBlockSize + domainX, y * Data.RankBlockSize + domainY, Color.FromArgb((int)pixel, (int)pixel, color.B)); continue; } if (i == 2) { bbOriginal.SetPixel(x * Data.RankBlockSize + domainX, y * Data.RankBlockSize + domainY, Color.FromArgb((int)pixel, color.G, color.B)); continue; } } } } } bbOriginal.Unlock(); image = bbOriginal.Bitmap; temp = new Bitmap(image); bbOriginal = new BufferedBitmap(image); } bbOriginal.Unlock(); bbReduced.Unlock(); image = bbOriginal.Bitmap; reduced = new Bitmap(ResizeImage(image, width / 2, height / 2)); images[nb] = new Bitmap(image); var a = new Bitmap(image); a.Save(nb + ".jpg"); bbOriginal = new BufferedBitmap(image); bbReduced = new BufferedBitmap(reduced); } image.Save(Path.GetDirectoryName(Data.Path) + "//" + Path.GetFileNameWithoutExtension(Data.Path) + "-restored.png"); sw.Stop(); MessageBox.Show("Восстановление завершено\r\nВремя: " + (sw.ElapsedMilliseconds / 1000.0).ToString()); return(images); }