【问题标题】:Win32 C/C++ Load Image from memory bufferWin32 C/C++ 从内存缓冲区加载图像
【发布时间】:2011-02-22 15:07:26
【问题描述】:

我想在 Win32 应用程序上加载图像 (.bmp) 文件,但我不想使用 Windows API 中的标准 LoadBitmap/LoadImage:我希望它从内存中的缓冲区加载。我可以轻松地直接从文件中加载位图并将其打印在屏幕上,但这个问题让我卡住了。

我正在寻找的是一个像这样工作的函数:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height);

【问题讨论】:

    标签: c++ windows winapi bitmap


    【解决方案1】:

    不可以,但是您可以在内存中创建一个与当前位图大小相同的新位图,并将您的内存结构写入其上。

    您正在寻找CreateBitmap 函数。将 lpvBits 设置为您的数据。

    【讨论】:

      【解决方案2】:

      试试CreateBitmap():

      HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height)
      {
          return CreateBitmap(width, height, 1, 24, buffer);
      }
      

      【讨论】:

        【解决方案3】:

        CreateDIBSection 使用起来可能有点复杂,但它可以做的一件事是创建一个独立于设备的位图,并为您提供一个指向位图位缓冲区的指针。当然,您已经有一个充满位图位的缓冲区,但至少您可以复制数据。

        推测一下:CreateDIBSection 也可以从文件对象创建位图,并且可能有一种方法可以让 Windows 为您提供代表一块内存的文件对象,这可能会欺骗 CreateDIBSection 为您提供构建的位图直接从你的缓冲区中。

        【讨论】:

        • CreateDIBSection 是要使用的正确 API。它使用的内存必须是一种特定类型的内核内存(因为图形设备驱动程序需要访问它) - 这可以通过文件部分(作为内核结构本身)或让 CreateDIBSection 分配内存来满足。跨度>
        【解决方案4】:

        没关系,我找到了解决方案!这是初始化代码:

        std::ifstream is;
        is.open("Image.bmp", std::ios::binary);
        is.seekg (0, std::ios::end);
        length = is.tellg();
        is.seekg (0, std::ios::beg);
        pBuffer = new char [length];
        is.read (pBuffer,length);
        is.close();
        
        tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer;
        tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER));
        RGBQUAD             rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER));
        
        BITMAPINFO bi;
        bi.bmiColors[0] = rgb;
        bi.bmiHeader = bih;
        
        char* pPixels = (pBuffer+bfh.bfOffBits);
        
        char* ppvBits;
        
        hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0);
        SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS);
        
        GetObject(hBitmap, sizeof(BITMAP), &cBitmap);
        

        【讨论】:

        • 您好,我是 java 开发人员,但在我的应用程序中,我还需要从 c++ 加载图像,但我不知道该怎么做。我在互联网上研究了很长时间,但仍然无法得到它。所以请你提供你的整个代码,我非常需要它。请
        猜你喜欢
        • 1970-01-01
        • 2011-03-31
        • 2023-02-04
        • 1970-01-01
        • 2013-03-21
        • 2013-01-10
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多