Реверсивная выборка Jump Pixel Sampling в байтовом массиве сжатого изображения - PullRequest
0 голосов
/ 12 апреля 2020

Мне было поручено извлечь изображение размером 248 * 296 пикселей из байтового массива 9176 байтов. Мне удалось сделать часть смещения битов извлечения изображения, но это оставляет вас с изображением 124 * 148 пикселей. Я не понимаю, что подразумевается под «выборкой скачка пикселей», и я подозреваю, что именно здесь я ошибаюсь. Мой код здесь далеко не идеален, поэтому любая помощь в его очистке была бы признательна, но в основном мне нужна помощь в понимании того, что документация просит меня сделать?

Вот пример документации, которую я получил учитывая, что относится к сжатию изображения.

Изображение составляет 248 * 296 пикселей, серость каждого пикселя представлена ​​8 битами. Во время процесса загрузки, чтобы уменьшить объем данных, прыгните сэмплирование пикселей в горизонтальном / вертикальном направлении, чтобы изображение стало 124 * 148, и возьмите яркость для старшего 4-битного, каждые два пикселя объединены в один байт для передачи (4-битный низкий предыдущий пиксель, 4-битный высокий последний пиксель).

это моя попытка преобразования байта [] в растровое изображение

public static Bitmap GetImage(byte[] image, int w, int h)
    {
        var newData = new byte[image.Length * 8];
        for (int x = 0; x < image.Length; x++)
        {
            int pix = image[x];
            byte pix1 = (byte)(((pix & 0xF0) >> 4) * 16);
            byte pix2 = (byte)((pix & 0x0F) * 16);

            newData[(x * 8) + 0] = pix1;
            newData[(x * 8) + 1] = pix1;
            newData[(x * 8) + 2] = pix1;
            newData[(x * 8) + 3] = pix1;

            newData[(x * 8) + 4] = pix2;
            newData[(x * 8) + 5] = pix2;
            newData[(x * 8) + 6] = pix2;
            newData[(x * 8) + 7] = pix2;
        }

        using (var bmp = new Bitmap(w, h, PixelFormat.Format32bppRgb))
        {
            BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);

            var pNative = bmpData.Scan0;
            Marshal.Copy(newData, 0, pNative, newData.Length);
            bmp.UnlockBits(bmpData);

            using (Image sourceImg = bmp)
            {
                Bitmap clonedImg = new Bitmap(sourceImg.Width, sourceImg.Height, PixelFormat.Format32bppArgb);
                using (var copy = Graphics.FromImage(clonedImg))
                {
                    copy.DrawImage(sourceImg, 0, 0);
                }
                return clonedImg;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...