确定颜色位图是否为黑色和白色

Tom*_*ear 1 gdi+ c++-cli bitmap foxit visual-c++

我有一个HBitmap,我从我用来转换PDF文档中的页面的API中收到.生成的位图是24位彩色位图.我试图确定,使用制作成pdfs的黑白扫描图像,在Foxit生成的位图上是黑白的.Foxit是PDF API.这是一些代码!(C/CLI)

// Get HBITMAP using Foxit's RenderPage function
// to convert to dib later
IntPtr hbitmap = FlattenPageToHBitmap(filename, page);

if (hbitmap == IntPtr::Zero) 
    return IntPtr::Zero;

Bitmap^ b = Bitmap::FromHbitmap(hbitmap);

bool isColor = false;
for (int y = 0; y < b->Height; y++)
{
    for (int x = 0; x < b->Width; x++)
    {
         Color^ c = b->GetPixel(x, y);
         unsigned int bits = (int)c->ToArgb();
         bits = bits << 8;
         bits = bits >> 8; //should get rid of A in ARGB
         bool white = (bits == 0xFFFFFF);
         bool black = (bits == 0);
         if (!black && !white)
         {
        isColor = true;
        break;
         }
    }

    if (isColor)
         break;
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我有了这个HBitmap并确定了它的颜色,我会将HBitmap转换为独立于设备的位图,我可以使用我们的内部工具包来回写各种文档格式.

问题

Foxit产生的HBitmap似乎永远不是完全黑色或白色.有没有一种算法可以用来查看它是否"足够接近"并转换它?在将其保存回pdf以确定使用的压缩时,使用位图的像素格式.

Ben*_*igt 6

当然,只需计算亮度并测试它是否真的接近零或一.

Color c = b->GetPixel(x, y); // no ^ because Color is a value type
float Y = (0.2126*c.R + 0.7152*c.G + 0.0722*c.B) / 255;
bool white = (Y > .95);
bool black = (Y < .05);
if (!black && !white)
{
    isColor = true;
    break;
}
Run Code Online (Sandbox Code Playgroud)

使用维基百科的亮度公式.

或者,Y = c.GetBrightness();也可以工作.


Dan*_*dor 5

如果你知道如何得到每个像素的 R、G 和 B,那么 BW 图片应该有 R == G == B。

如果不是,并且您希望它是灰度的,请使用此公式计算新的 RGB 值:

value = 0.3 R + 0.59 G + 0.11 B
Run Code Online (Sandbox Code Playgroud)

用值填充 R、G 和 B,然后就可以了。