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以确定使用的压缩时,使用位图的像素格式.
当然,只需计算亮度并测试它是否真的接近零或一.
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();也可以工作.
如果你知道如何得到每个像素的 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,然后就可以了。
| 归档时间: |
|
| 查看次数: |
2366 次 |
| 最近记录: |