Windows — Как преобразовать файл изображения, загруженный в память, в ID2D1Bitmap в переполнении стека

Я пытаюсь преобразовать файл изображения (png, но может быть что угодно), который я только что извлек в память из сжатого файла, в ID2D1Bitmap для рисования с использованием Direct 2D. Я попытался найти некоторую документацию, но я могу найти только те методы, которые получают «const char * path» или спрашивают меня ширину и высоту моего изображения, которые я не могу знать заранее.
Поиск в Google для меня ни к чему.

Файл является сырым в памяти, и я хотел бы избежать извлечения изображений на жесткий диск во временный файл, чтобы просто прочитать их данные оттуда.

Есть идеи?

1

Решение

если у вас есть дескриптор HBITMAP, вы можете сделать это:

  1. Размер вашего изображения с помощью: ::GetObject(hBmp, sizeof(BITMAP), &bmpSizeInfo);
  2. заполните BITMAPINFO так:

    memset(&bmpData, 0, sizeof(BITMAPINFO));
    bmpData.bmiHeader.biSize = sizeof(bmpData.bmiHeader);
    bmpData.bmiHeader.biHeight = -bmpSizeInfo.bmHeight;
    bmpData.bmiHeader.biWidth = bmpSizeInfo.bmWidth;
    bmpData.bmiHeader.biPlanes = bmpSizeInfo.bmPlanes;
    bmpData.bmiHeader.biBitCount = bmpSizeInfo.bmBitsPixel;

  3. создайте достаточно памяти кучи для хранения данных для вашего растрового изображения:

    pBuff = new char[bmpSizeInfo.bmWidth * bmpSizeInfo.bmHeight * 4];

  4. Получить данные растрового изображения, как это:

    ::GetDIBits(hDc, hBmp, 0, bmpSizeInfo.bmHeight, (void*)pBuff, &bmpData, DIB_RGB_COLORS);

  5. Создать D2D1_BITMAP_PROPERTIES и заполните это так:

    bmpPorp.dpiX = 0.0f;
    bmpPorp.dpiY = 0.0f;
    bmpPorp.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
    bmpPorp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;

  6. Используя вашу цель рендеринга, превратите данные в ID2D1Bitmap

    pRT->CreateBitmap(bmpSize, pBuff, 4 * bmpSizeInfo.bmWidth, bmpPorp, &pBmpFromH);

Надеюсь, это поможет.

Сэм

3

Другие решения


По вопросам рекламы [email protected]