【问题标题】:ATL CImage::SetPixel not working for monochrome BMPs (nBPP=1)ATL CImage::SetPixel 不适用于单色 BMP (nBPP=1)
【发布时间】:2021-03-30 03:08:56
【问题描述】:

我正在尝试编写一个更改 BMP 文件并在特定位置添加一些修改的程序。我要修改的 BMP 是单色的(每像素 1 位),因为图像尺寸需要非常小。我正在使用 ATL CImage 类来执行此操作。

但是,我似乎无法使用 SetPixel 更改单色 BMP 的特定像素。

(为简单起见,我稍微修改了这段代码。“颜色”来自程序的另一部分,只返回 RGB(255,255,255) 或 RGB(0,0,0))

CImage bmp;
bmp.Create(180, 1369, 1);
for (int y = 0; y < 1369; y++)
    {
        for (int x = 0; x < 180; x++) {
            bmp.SetPixel(x, y, color);
        }
    }

此代码在显示时返回黑色 BMP。如果我将 bmp.Create 中的“1”(即每像素的位数)修改为大于 8 的任何值,则代码将按预期工作。但是,该修复不适合我,因为我最终得到的 BMP 太大。

有什么方法可以让 SetPixel 在这里工作吗?

【问题讨论】:

  • 也许color 需要是01
  • 我已经尝试过(可能应该提到它!)。我将“颜色”更改为 1,以查看它是否至少会输出白色 BMP。它仍然输出黑色。我也尝试了 0 以防 1 是黑色而 0 是白色,但不行。
  • 如果你创建一个白色单色位图并打开它并执行 GetPixel(0,0) 你会得到什么值?

标签: c++ gdi+ gdi atl cimage


【解决方案1】:

看起来,当您使用 Create() 制作单色位图时,它会创建一个两种颜色均为黑色的位图。您需要调整颜色表:

RGBQUAD colors[2] = { 0 };
bmp.GetColorTable(0, 2, colors);
colors[1].rgbRed = colors[1].rgbGreen = colors[1].rgbBlue = 0xff;
bmp.SetColorTable(0, 2, colors);

那么如果你 SetPixel 为 RGB(0xff,0xff,0xff) 它应该可以正常工作

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2014-07-15
    • 2012-03-18
    • 2012-03-09
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2011-03-31
    • 2012-11-25
    相关资源
    最近更新 更多