【问题标题】:Gdiplus on C++ configuration for binary image?二进制图像的 C++ 配置上的 Gdiplus?
【发布时间】:2020-12-14 17:50:42
【问题描述】:

是否有任何设置可以设置 GDIPlus 图形方法或位图方法的颜色仅指示二进制图像的黑白颜色 (0,0,0/255,255,255)?我已经尝试过位图类的调色板选项(getPalette / setPalette),但它根本不起作用。

我已经访问了图像本身,但它也不起作用。请注意图片本身。

    for (int bufidx = 0; bufidx < m_BufferSize; bufidx++)
                    {
                        if (m_pImage[BINARY_VID][bufidx] > m_Threshold)
                        {
                            m_pImage[BINARY_VID][bufidx] = 255;
                        }
                        else
                        {
                            m_pImage[BINARY_VID][bufidx] = 0;
                        }
                    } // Algorithm for thresholding image

这是更改数据本身的代码。 m_buffersize 是图片的大小(宽*高)

m_pImage[BINARY_VID]是数据本身,有0~255个值的8位数据。数据来自相机模块。

    m_pBitmap[vidType]->LockBits(&rc, 0, PixelFormat8bppIndexed, &bitmapdata);
    memcpy(bitmapdata.Scan0, m_pImage[vidType], m_BufferSize);
    m_pBitmap[vidType]->UnlockBits(&bitmapdata);

这是我将其转换为位图方法的部分

int paletteSize = m_pBitmap[vidType]->GetPaletteSize();
ColorPalette* pPalette = new ColorPalette[paletteSize];
m_pBitmap[vidType]->GetPalette(pPalette, paletteSize);
// gets palette info of bitmap image to set color info of the bitmap
switch (vidType)
{
case NORMAL_VID:
case ROI_VID:
    for (unsigned int i = 0; i < pPalette->Count; i++)
    {
        pPalette->Entries[i] = Color::MakeARGB(255, i, i, i);
    }
    m_pBitmap[vidType]->SetPalette(pPalette);
    break;
    // Normal video || ROI video color set
case BINARY_VID:
    for (unsigned int i = 0; i < pPalette->Count; i++)
    {
        if (i > m_Threshold)
        {
            pPalette->Entries[i] = Color::MakeARGB(255, 255, 255, 255);
        }
        else
        {
            pPalette->Entries[i] = Color::MakeARGB(255, 0, 0, 0);
        }
    }
    m_pBitmap[vidType]->SetPalette(pPalette);
    break;

default:
    AfxMessageBox(TEXT("vidtype error : on converting palette!"));
    delete[] pPalette;
    return;
    break;
}
delete[] pPalette;
MemoryLeakCheck();

这是我用来转换颜色的部分。

这是我得到的结果图像。我只是不知道为什么我在只有 0 或 255 数据的二进制图像上有灰色噪声。

【问题讨论】:

  • 提供的图片无法让我们看到图片数据的真实来源。请使用无损格式上传图片(例如 PNG,虽然我不确定 imgur 是否会为您将它们转换为 JPEG)。

标签: c++ image image-processing mfc gdi+


【解决方案1】:

这张图片没有灰色,那是假象。

【讨论】:

  • 其实这张图片有灰色的,虽然不清楚这是来自源图片还是选择有损图片压缩算法的产物。
  • @IInspectable:不,你可以看到代码将图像二值化为黑白。没有中间灰色。
  • 当然,我可以看到代码。但我也可以看到你提供的图像。这显然不是单色的。在左上角的白色区域中有很多不同灰度的像素。如果您看得足够近,您会看到其他灰色像素。
  • @IInspectable:来吧,我不是在谈论屏幕副本,我是在谈论 OP 的代码显示的内容。黑白、0 和 255,仅此而已。
  • OP 很清楚他们的代码应该做什么,但显然他们的观察与他们的期望不符。这就是需要解决的问题。声称图像中没有任何灰色像素,然后是放大版的图像明显与该声明相冲突并没有任何帮助。
猜你喜欢
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2014-06-07
  • 2016-02-21
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多