强制 WIC 将图像数据视为 RGB
Forcing to WIC to treat image data as RGB
我有一个 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 "treat the data as RGB(or BGR)".
这可能吗?如果是那么怎么办?
您可以先创建位图。那时你可以说它需要的格式。这是“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()
内部会发生什么。由于您关心时间,我不知道这是否有帮助(它仍然可以使您的代码更好)。
找到方法了。
This forum 说,
对此进行了介绍
JPEG 编码器编码三种格式:
- GUID_WICPixelFormat8bppGray
- GUID_WICPixelFormat24bppBGR
- GUID_WICPixelFormat32bppCMYK
如果您的源数据采用不同的格式,您需要使用 IWICFormatConverter 作为链的一部分。
我有一个 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 "treat the data as RGB(or BGR)".
这可能吗?如果是那么怎么办?
您可以先创建位图。那时你可以说它需要的格式。这是“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()
内部会发生什么。由于您关心时间,我不知道这是否有帮助(它仍然可以使您的代码更好)。
找到方法了。 This forum 说,
对此进行了介绍JPEG 编码器编码三种格式:
- GUID_WICPixelFormat8bppGray
- GUID_WICPixelFormat24bppBGR
- GUID_WICPixelFormat32bppCMYK
如果您的源数据采用不同的格式,您需要使用 IWICFormatConverter 作为链的一部分。