【发布时间】:2018-02-17 11:18:40
【问题描述】:
我写了一个小函数来将 ARGB 中的位图转换为灰度。转换本身效果很好,但结果是颠倒的。 我找不到错误。
代码: #包括 #包括
inline BYTE GrayScaleValue(BYTE* r, BYTE* g, BYTE* b) { return /*ceil*/(0.21f * (*r) + 0.72f * (*g) + 0.07f * (*b)); }
extern "C" __declspec(dllexport) HBITMAP ConvertToMonocrom(HBITMAP bmp) {
INT x = 0, y = 0;
char Gray;
BITMAP bm;
GetObject(bmp, sizeof(BITMAP), (LPSTR)&bm);
BYTE * pImgByte = (BYTE *)bm.bmBits;
INT iWidthBytes = bm.bmWidth * 4;
for (y = 0; y < bm.bmHeight; y++) {
for (x = 0; x < bm.bmWidth; x++) {
Gray = GrayScaleValue(&pImgByte[y * iWidthBytes + x * 4 + 3], &pImgByte[y * iWidthBytes + x * 4 + 2], &pImgByte[y * iWidthBytes + x * 4 + 1]);
pImgByte[y * iWidthBytes + x * 4] = Gray;
pImgByte[y * iWidthBytes + x * 4 + 1] = Gray;
pImgByte[y * iWidthBytes + x * 4 + 2] = Gray;
pImgByte[y * iWidthBytes + x * 4 + 3] = Gray;
}
}
return CreateBitmapIndirect(&bm);
}
图片如下:
嗯,我不知道,为什么他将“透明”设置为黑色......
【问题讨论】:
-
提示:在位图数据填充的情况下,您应该使用
bm.bmWidthBytes而不是iWidthBytes(虽然不确定ARGB位图是否会发生,但通常可能会发生) -
一旁的问题:你为什么把灰度值也设置为A通道?将它们写入我理解的所有颜色通道,这就是灰色。但我不希望图片像暗(或亮,取决于型号)那样不透明。
-
如果您禁用(暂时,就像调试实验一样)灰色制作并且只复制未更改的值会发生什么?我想知道输入和输出文件格式在 y 坐标的含义上是否完全不同。
-
我认为颠倒错误更有可能在您的灰色功能之外,例如渲染设置或投影矩阵错误。所以请多显示一些周围的代码。最好是minimal reproducible example。还是您将图像文件转换为图像文件?请描述。
标签: c++ bitmap grayscale argb hbitmap