Монохромный растр C ++ GDIPlus - PullRequest
2 голосов
/ 22 апреля 2011

В настоящее время у меня возникают проблемы с отображением монохромного растрового изображения в моей форме.Я верю, что каким-то образом я неправильно настраиваю свое растровое изображение, но я не вижу, где это будет в данный момент.Все, что мне нужно сделать, чтобы «исправить» эту проблему, - установить для biBitCount значение 24, но затем, когда я вызываю DWORD d = GetCharacterPlacementA last, я вижу, что поврежденная память включена позже.Поэтому я пытаюсь сохранить свое первоначальное стремление к монохромному растровому изображению, а не к утечке памяти.

В настоящее время я храню свою растровую информацию в стандартных переменных:

BITMAPINFO bi24BitInfo;
HDC hMemoryDC;
HBITMAP hMemoryBitmap;
HGDIOBJ hDefaultBitmap;
HBITMAP hGdiBitmap;

Я устанавливаю растровое изображение:

hMemoryDC = CreateCompatibleDC(NULL);

bi24BitInfo.bmiHeader.biSize = sizeof(bi24BitInfo.bmiHeader);   // size of this struct
bi24BitInfo.bmiHeader.biWidth = 600;//sizeRect.cx;      // width of window
bi24BitInfo.bmiHeader.biHeight = 600;//sizeRect.cy; // height of window
bi24BitInfo.bmiHeader.biPlanes = 1;
bi24BitInfo.bmiHeader.biBitCount = 1;               // monochrome // rgb 8 bytes for each component(3)
bi24BitInfo.bmiHeader.biCompression = BI_RGB;   // Means its uncompressed. Has nothing to do with color.
bi24BitInfo.bmiHeader.biSizeImage = 0;
bi24BitInfo.bmiHeader.biXPelsPerMeter = pelsPerMeter;
bi24BitInfo.bmiHeader.biYPelsPerMeter = pelsPerMeter;
bi24BitInfo.bmiHeader.biClrUsed = 2;
bi24BitInfo.bmiHeader.biClrImportant = 0;
bi24BitInfo.bmiColors[0].rgbBlue = 0;
bi24BitInfo.bmiColors[0].rgbRed = 0;
bi24BitInfo.bmiColors[0].rgbGreen = 0;
bi24BitInfo.bmiColors[0].rgbReserved = 0;
bi24BitInfo.bmiColors[1].rgbBlue = (BYTE)0xFF;
bi24BitInfo.bmiColors[1].rgbRed = (BYTE)0xFF;
bi24BitInfo.bmiColors[1].rgbGreen = (BYTE)0xFF;
bi24BitInfo.bmiColors[1].rgbReserved = 0;

// Create the memory bitmap
if (hMemoryBitmap != NULL)
{
    DeleteObject(hMemoryBitmap);
}
hMemoryBitmap = CreateCompatibleBitmap(hMemoryDC, 600, 600);
hDefaultBitmap = SelectObject(hMemoryDC, hMemoryBitmap);
HGDIOBJ hOldFont = SelectObject(hMemoryDC, GetStockObject(NULL_BRUSH));
// Do not fill background
int nOldBkMode = GetBkMode(hMemoryDC);
SetBkMode(hMemoryDC, TRANSPARENT);

int nRet(0);

if (hDIB != NULL)
{
    GlobalFree(hDIB);
}
DWORD dwBmpSize = ((bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biBitCount + 31) / 32) * 4 * bi24BitInfo.bmiHeader.biHeight;
//DWORD dwBmpSize = ((bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight)/8);
// Starting with 32-bit Windows, GlobalAlloc and LocalAlloc are implemented as wrapper functions that call HeapAlloc using a handle
// to the process's default heap. Therefore, GlobalAlloc and LocalAlloc have greater overhead than HeapAlloc.
hDIB = GlobalAlloc(GHND, dwBmpSize);
DWORD D = GetLastError();
pBytes = (BYTE*)GlobalLock(hDIB);
D = GetLastError();
nRet = GetDIBits(hMemoryDC, hMemoryBitmap, 0, (UINT)bi24BitInfo.bmiHeader.biHeight, pBytes, (BITMAPINFO*)&bi24BitInfo, DIB_RGB_COLORS);
D = GetLastError();
if (pBitmap != NULL)
{
    delete pBitmap;
    pBitmap = NULL;
}
pBitmap = new Gdiplus::Bitmap(&bi24BitInfo, pBytes);
D = GetLastError();
GlobalUnlock(hDIB);
D = GetLastError();

Затем после всего этого я получаю сообщение об ошибке:

pGraphics = Graphics::FromImage(pBitmap);
// set a graphics property
s = pGraphics->SetTextRenderingHint(TextRenderingHintAntiAlias);

После этого pGraphics-> LastResult теперь установлен в«OutOfMemory» и s устанавливаются в перечисление «InvalidParameter» из: http://msdn.microsoft.com/en-us/library/ms534175(v=VS.85).aspx

Любая помощь по этому вопросу будет оценена.

1 Ответ

0 голосов
/ 22 апреля 2011

BITMAPINFO содержит место только для одной записи палитры;когда вы пишете в bi24BitInfo.bmiColors[1], вы забиваете следующую память, вероятно, hMemoryDC.Исправьте это, создав другую структуру, содержащую BITMAPINFO спереди и массив для следующей палитры.

Редактировать: Похоже, вы не можете создать объект Graphics измонохромное растровое изображение.Из документации Graphics::FromImage:

Этот метод также не работает, если изображение имеет один из следующих форматов пикселей:

  • PixelFormatUndefined
  • PixelFormatDontCare
  • PixelFormat1bppIndexed
  • PixelFormat4bppIndexed
  • PixelFormat8bppIndexed
  • PixelFormat16bppGray55 * 10 * 10
...