Отображение изображения растрового изображения, getObject, кажется, неправильно размер некоторых параметров в структуре C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Отображение изображения растрового изображения, getObject, кажется, неправильно размер некоторых параметров в структуре

Сообщение Anonymous »

Мой вопрос относится к задаче, которую я изначально считал простым. Теперь я обнаружил, что есть много деталей
, которые не были сначала рассмотрены. Моя первоначальная цель состояла в том, чтобы нарисовать изображение флага в диалоговом окне. Для простоты я начал просто отображать его в главном окне. Я начал с поиска изображения, изменения его размера и сохраняя его с предполагаемой глубиной цвета. Файл Bitmap / .bmp казался простым, это то, что я намеревался использовать. В моем случае был выбран четыре битного/шестнадцать цвет для уменьшения размера файла. Фактический размер в файле имеет ширину 600 и высотой 300. Это дает файл с данными 90 тыс. Пикселей, плюс заголовок, который в моем случае составляет 118 байт. Сначала я загружаю изображение, используя следующую последовательность ... Я удалил проверку ошибки для ясности: < /p>

Код: Выделить всё

hFlag = LoadImage(GetModuleHandle(NULL), wcImageFile,
IMAGE_BITMAP, 600, 300, LR_DEFAULTCOLOR | LR_LOADFROMFILE);

GetObject(hFlag, sizeof(BITMAP), &bitmap);
< /code>
Содержание растрового изображения - это не то, что я ожидаю после запуска этой короткой последовательности. Результат для
bmtype, bmwidth, bmheight, bmwidthbytes, bmplanes, как я и ожидал. Однако Bmbitspixel
- 0x20 или 32. Bmbits - нулевой указатель. GetObject возвращает
int 0x18, который составляет размер растровой структуры, которую он заполняет. Все, как и ожидалось. Тем не менее, биты на пиксель, которые, как я ожидаю, будет 4 возврата в 32. В случае 32 битов/пикселей размер массива данных пикселей будет коротким в восемь раз. Это, вероятно, будет обнаружено, и сгенерировал нулевой указатель.SelectObject(hdcMem, hFlag);
BitBlt(hdc, 0, 0, 600, 300, hdcMem, 0, 0, SRCCOPY);
< /code>
затем отображается флаг. Я надеюсь, что кто -то может помочь мне понять это. Я работаю через Petzold, однако это большая книга.case WM_CREATE:
{
const wchar_t   *wImageFile;
wImageFile =    L"C:\\Users\\Tom\\Pictures\\Flag\\Flag.bmp";
DWORD           dwError = 0;

hFlag = (HBITMAP) LoadImage(GetModuleHandle(NULL), wImageFile, IMAGE_BITMAP, 600, 300, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(hFlag == 0)
dwError = GetLastError();
int nWhatsit = GetObject(hFlag, sizeof(BITMAP), &bitmap);
return (INT_PTR)FALSE;
}
//////////////////////////////////////////////////
Вопрос Сначала спросил предложенный отображение изображения в главном окне. Заметив, что флаг, который я хотел показать, имел только два цвета, я отклонил свой первоначальный вопрос, сделав сохраняемое изображение монохромным (черно -белое, когда он отображается Paint & Eshrie). Это было сделано для дальнейшего уменьшения размера файла. const uint8 uflagbin [] = {
0x42, 0x4d, 0x7e, 0x5a, 0x00, 0x00, ..... 0xcd, 0xfd}; < /p>
608 x 304 -битный монохромный BMP оказывается длиной 23 168 байт. Это включает в себя растровое изображение и заголовки. Я уверен, что есть лучший способ сделать это, который я еще не обнаружил.case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
HDC hdcMem;
BITMAPFILEHEADER *pBMFHeader; // File header
BITMAPINFO *pBMInfo; // Bitmap info
BITMAPINFOHEADER *pBMIHeader; // Bitmap info header
RGBQUAD *pRGBQuad; // RGBQuad array pointer
HBITMAP hFlagBitmap = NULL; // Handle
BITMAPINFO bmi;
BITMAP bm;
char* ppvBits;
char *pPixels; // Pixel array
BOOL bFault;
LRESULT lrResult;

const UINT8 uFlagBin[] = { ... }

int nInfo = sizeof(uFlagBin);

hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);

pBMFHeader = (BITMAPFILEHEADER*)uFlagBin;
pBMInfo = (BITMAPINFO*)(uFlagBin + sizeof(BITMAPFILEHEADER));
pBMIHeader = (BITMAPINFOHEADER*)pBMInfo;
pRGBQuad = (RGBQUAD*)(pBMInfo + sizeof(pBMIHeader));

pPixels = (char*)uFlagBin + pBMFHeader->bfOffBits;

hFlagBitmap = CreateDIBSection(hdcMem, pBMInfo, DIB_RGB_COLORS, (void**)&ppvBits, NULL, 0);

GetObject(hFlagBitmap, sizeof(BITMAP), &bm);

memcpy(bm.bmBits, pPixels, (bm.bmWidth * bm.bmHeight * bm.bmBitsPixel) / 8);

bm.bmHeight = bm.bmHeight * -1;

SelectObject(hdcMem, hFlagBitmap);

const RGBQUAD rgbqRed = { 0x00, 0x00, 0xFF, 0x00 };
SetDIBColorTable(hdcMem, 0, 1, &rgbqRed);

BitBlt(hdc, 0, 0, 608, 304, hdcMem, 0, 0, SRCCOPY);

DeleteObject(hFlagBitmap);

DeleteDC(hdcMem);

EndPaint(hWnd, &ps);

return (INT_PTR)FALSE;
}
< /code>
Большая часть определения заголовка не требуется. Только что сделал мой интерес. Флаг отображается должным образом и, кажется, работает так, как разработано. Единственная проблема, которая остается с кодом, заключается в том, что огромный массив, созданный для хранения битового файла. Это заставляет Visual Studio работать упорно в любое время, когда она перекомпиляется. -Tom

Подробнее здесь: https://stackoverflow.com/questions/794 ... parameters
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»