2015-07-08 5 views
1

Растровое изображение построено по пиксельным данным (чисто пиксельные данные). Конструкция была выполнена путем правильной настройки параметров растрового изображения, таких как hieght, width, bitcount и т. Д. Bitmap фактически сконструирован с помощью CreateDIBsection. И растровое изображение загружается на объект CStatic, имеющий свойство Bitmap как свойство.Монохромное изображение, отображаемое как цветное изображение RGB

Изображение отображается с соответствующей шириной и содержимым. Но разница только в том, что цвет контента окрашен вместо шкалы серого. Например, изображение представляет собой белое письмо H на черном Bground, вместо того, чтобы отображать его как беловатое, скажем, отображается синяя H-буква. Подобные изменения цвета применяются для разных изображений. Кроме того, иногда нежелательные цветные данные кажутся отклоняющимися от исходного содержимого изображения, кроме изменения цвета.

Bitmap - это 16-битное растровое изображение.

См. Ниже код, используемый для создания BitMap.

HDC - это контекст устройства переменной CStatic, в котором загружается созданный растровый рисунок; Я сразу установил битмап, возвращаемый функцией ниже, этой переменной, используя функцию setbitmap. CStatic varibale имеет также BitMap как одно из своих свойств. См. Ниже функцию, используемую для создания растрового изображения.

Определения параметров функции. PixMapHeight = количество строк в пиксельной матрице. PixMapWidth = количество столбцов в пиксельной матрице. BitsPerPixel = бит, хранящийся для одного пикселя. pPixMapBits = указатель Void на пиксельный массив. (Только исходные пиксельные данные 16 бит на пиксель). DoBitmapFromPixels (HDC HDC, UINT PixMapWidth, UINT PixMapHeight, UINT BitsPerPixel, LPVOID pPixMapBits)

BITMAPINFO *bmpInfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); 
    BITMAPINFOHEADER &bmpInfoHeader(bmpInfo->bmiHeader); 
    bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); 
    LONG lBmpSize = PixMapWidth * PixMapHeight * (BitsPerPixel/8); 
    bmpInfoHeader.biWidth = PixMapWidth; 
    bmpInfoHeader.biHeight = -(static_cast<int>(PixMapHeight)); 
    bmpInfoHeader.biPlanes = 1; 
    bmpInfoHeader.biBitCount = BitsPerPixel; 
    bmpInfoHeader.biCompression = BI_RGB; 
    bmpInfoHeader.biSizeImage = 0; 
    bmpInfoHeader.biClrUsed = 0; 
    bmpInfoHeader.biClrImportant = 0; 
    void *pPixelPtr = NULL; 
    HBITMAP hBitMap = CreateDIBSection(Hdc, bmpInfo, DIB_RGB_COLORS, &pPixelPtr, NULL, 0); 
    if (pPixMapBits != NULL) 
    { 
     BYTE* pbBits = (BYTE*)pPixMapBits; 
     BYTE *Pix = (BYTE *)pPixelPtr; 
     memcpy(Pix, ((BYTE*)pbBits + (lBmpSize * (CurrentFrame - 1))), lBmpSize); 
    } 
    free(bmpInfo); 
    return hBitMap; 

Предполагаемый выход является цифра в левой части прикрепленного файла. Но я получаю синее тонированное изображение, как в правом (не обращая внимания на проблему масштабирования и точного совпадения, поместите изображение, чтобы изобразить проблему).

MismatchImage

А также будет очень полезно, если я знаю, как значения RGB, хранятся в 16 бит!

+0

Здесь недостаточно информации, но я бы предсказал, что у вас есть один 8-битный канал, и он отображается с палитрой по умолчанию, которая не является палитрой оттенков серого. –

+0

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

+1

Вы говорите, что это 16-битное растровое изображение, поэтому оно не монохромно. (Монохромный означает один бит на пиксель. После того, как вы это исправите, вам нужно знать, что blitting монохромные растровые изображения в назначении цвета используют цвет текста и фона для отображения черно-белого.) –

ответ

1

Вы никогда не говорили, какой формат pPixMapBits есть, но я предполагаю, что он содержит 16-битные значения, где 0 представляет черный цвет, 32768 представляет серый, а 65535 - белый.

Вы создаете BITMAPINFOHEADER с bitBitCount = 16 и biCompression = BI_RGB. Согласно the documentation, если вы установите поля, путь, то:

Каждый WORD в массиве точечного рисунка представляет собой один пиксель. Относительные интенсивности красного, зеленого и синего представлены пятью битами для каждой цветовой составляющей. Значение для синего цвета составляет наименее значимые пять бит, за которым следуют пять бит для зеленого и красного. Самый старший бит не используется.

Это не тот формат, что и исходные данные, и вы не делаете конверсии, поэтому получаете мусор. Обратите внимание, что формат растрового изображения, который вы выбрали, способен отображать только 2^5 = 32 оттенка серого, а не 65536, поэтому вы будете терпеть потерю качества во время преобразования.

+0

Обратите также внимание, что ваш расчет 'lBmpSize' неверен, если' PixMapWidth' является нечетным числом. Из документации: «[Строки сканирования выровнены по DWORD, за исключением Rm-сжатых растровых изображений. Они должны быть дополнены для ширины строк сканирования в байтах, которые не равномерно делятся на четыре, за исключением сжатых растровых изображений RLE.] (Https: //msdn.microsoft.com/en-us/library/dd183386(v=vs.85).aspx) " –

+0

Как создать растровое изображение в оттенках серого? Я использовал BI_RGB, поскольку изображение несжатое. Попробовали также BI_BITFIELDS. тоже не работает. И еще одно: нет никакой потери данных, а не немного. Изображение в масштабе серой отображается в виде синего масштаба. – ScarCode

+0

PixMapWidth всегда подходит как для изображений, с которыми я имею дело. – ScarCode