//создание случайного изображения
        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);
        }