- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 WICConvertBitmapSource
函数将像素格式从 BGR 转换为灰色,我得到了意想不到的像素值。
...
pIDecoder->GetFrame( 0, &pIDecoderFrame );
pIDecoderFrame->GetPixelFormat( &pixelFormat ); // GUID_WICPixelFormat24bppBGR
IWICBitmapSource * dst;
WICConvertBitmapSource( GUID_WICPixelFormat8bppGray, pIDecoderFrame, &dst );
4x3 图像示例,如下所示
[ 0, 0, 255, 0, 255, 0, 255, 0, 0;
0, 255, 255, 255, 255, 0, 255, 0, 255;
0, 0, 0, 119, 119, 119, 255, 255, 255;
233, 178, 73, 233, 178, 73, 233, 178, 73]
我得到的灰色像素值:
[127, 220, 76;
247, 230, 145;
0, 119, 255;
168, 168, 168]
我期望得到的灰色像素值 (
ITU-R BT.601 conversion )
[ 76, 149, 29;
225, 178, 105;
0, 119, 255;
152, 152, 152]
后台发生了什么样的转换,有没有办法强制转换为我想要的行为?
最佳答案
至于“后台正在发生什么样的转换”这个问题:似乎使用了不同的转换算法。使用 WINE 项目来计算灰度值,似乎给出了相同的结果,因此它为我们提供了一个很好的近似值。使用的公式是R * 0.2126 + G * 0.7152 + B * 0.0722
.copypixels_to_8bppGray
( source ):
float gray = (bgr[2] * 0.2126f + bgr[1] * 0.7152f + bgr[0] * 0.0722f) / 255.0f;
除此之外,它还针对 sRGB 色彩空间进行了校正。
copypixels_to_8bppGray
(
source ):
gray = to_sRGB_component(gray) * 255.0f;
to_sRGB_component
(
source ):
static inline float to_sRGB_component(float f)
{
if (f <= 0.0031308f) return 12.92f * f;
return 1.055f * powf(f, 1.0f/2.4f) - 0.055f;
}
插入一些值:
B G R WINE You're getting
0 0 255 127.1021805 127
0 255 0 219.932749 220
255 0 0 75.96269736 76
0 255 255 246.7295889 247
255 255 0 229.4984163 230
255 0 255 145.3857605 145
0 0 0 12.92 0
至于另一个问题,我对框架太陌生,无法回答,所以我将其留给其他人回答。
关于c++ - WICConvertBitmapSource BGR 到 Gray 意外像素格式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66566150/
我想使用 WindowsCodecs.dll 中的函数,但 MinGW 的 WinAPI header 以及导入库不完整且缺失。考虑以下演示: #define WIN32_LEAN_AND_MEAN
我正在尝试使用 WIC 对图像进行编码。我制作了简单的 dll(用于编码/解码)并从另一个应用程序中引用它。 我添加了 my_bitmap_converter() 来执行旨在使用 WICConvert
我正在尝试使用 WIC 将图像加载到内存缓冲区中以进行进一步处理,然后在完成后将其写回文件。具体来说: 将图像加载到 IWICBitmapFrameDecode 中。 加载的 IWICBitmapFr
我正在使用 WICConvertBitmapSource函数将像素格式从 BGR 转换为灰色,我得到了意想不到的像素值。 ... pIDecoder->GetFrame( 0, &pIDecoderF
我是一名优秀的程序员,十分优秀!