Мне было поручено извлечь изображение размером 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;
}
}
}