Вот более простое решение. Вы можете использовать GetPixelAddress (...) вместо всего этого BITMAPHEADERINFO и SedDIBitsToDevice. Другая проблема, которую я решил, была с 8-битными изображениями, для которых необходимо определить таблицу цветов.
ужно создатьCImage из байтового массива (на самом деле, это массивunsigned char
, но я могу привести к любой форме необходимо). Массив байтов имеет вид «RGBRGBRGB ...». Новое изображение должно содержатькопия байтов изображения, а не использование памяти самого байтового массива.
Я испробовал много разных способов достижения этой цели - в том числе, используя различные функции создания HBITMAP, пытаясь использовать BitBlt - и пока ничего не получалось.
Чтобы проверить, работает ли функция, она должна пройти этот тест:
BYTE* imgBits;
int width;
int height;
int Bpp; // BYTES per pixel (e.g. 3)
getImage(&imgBits, &width, &height, &Bpp); // get the image bits
// This is the magic function I need!!!
CImage img = createCImage(imgBits, width, height, Bpp);
// Test the image
BYTE* data = img.GetBits(); // data should now have the same data as imgBits
Все реализацииcreateCImage()
до сих пор закончили сdata
указывая на пустой (заполненный нулями) массив.