【问题标题】:Forcing to WIC to treat image data as RGB强制 WIC 将图像数据视为 RGB
【发布时间】:2015-04-27 08:52:57
【问题描述】:

我有一个 BYTE 数组(RGB 格式)的图像,我需要对其进行编码。我做了,但是颜色变了。

/*Create stream and initialized*/
hr = piFactory->CreateStream(&piStream);
hr = piStream->InitializeFromFilename(L"..\\test.jpg",GENERIC_WRITE);

/*created an encoder. I want to save JPG*/
hr = piFactory->CreateEncoder(GUID_ContainerFormatJpeg, NULL, &piEncoder);

做了一些操作,也尝试设置像素格式。

hr = piBitmapFrame->SetPixelFormat(&formatGUID);

但它总是设置为“GUID_WICPixelFormat24bppBGR”

我在这里写图像数据。

/*pBitmap contains image data*/
hr = piBitmapFrame->WritePixels(lHeight, cbStride, cbBufferSize, pBitmap);

问题是图像的颜色发生了变化,我发现如果我将 RGB 更改为 BGR,那么输出看起来很好。所以我这样做了

   for(int i = 0; i < DataSize; i += 3)
    {
        inBuff[i] = pBitmap[i+2];
        inBuff[i + 1] = pBitmap[i+1];
        inBuff[i + 2] = pBitmap[i];
    }

    pBitmap = inBuff

但我不想在这里花更多时间循环浏览整个图像。 我需要告诉 WIC“将数据视为 RGB(或 BGR)”。

这可能吗?如果是那怎么办?

【问题讨论】:

标签: c++ image-processing wic


【解决方案1】:

您可以先创建位图。那时你可以说它需要的格式。这是“24bppRGB”格式:

    hr = piFactory->CreateBitmapFromMemory(
        lWidth,
        lHeight,
        GUID_WICPixelFormat24bppRGB,
        cbStride,
        cbBufferSize,
        pBitmap,
        &piBitmapSrc
        );

这是您将图像数据写入框架的方式:

hr = piBitmapFrame->WritePixels(lHeight, cbStride, cbBufferSize, pBitmap);

而是像这样将图像写入框架(因为WritePixels() 不接受位图):

    hr = piBitmapFrame->WriteSource(
        piBitmapSrc,
        NULL
        );

这有助于避免循环。不过,我不确定CreateBitmapFromMemory() 内部会发生什么。由于您关心时间,我不知道这是否会有所帮助(它仍然可以使您的代码更好)。

【讨论】:

  • 看起来像它的工作。因为 WIC 的输入是一个 RGB 位图,所以不再自动改变颜色。谢谢。
【解决方案2】:

找到了方法。 This forum 说,

MSDN 对此进行了介绍

JPEG 编码器编码三种格式:

  • GUID_WICPixelFormat8bppGray
  • GUID_WICPixelFormat24bppBGR
  • GUID_WICPixelFormat32bppCMYK

如果您的源数据采用不同的格式,您需要使用 IWICFormatConverter 作为链的一部分。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2021-12-15
    相关资源
    最近更新 更多