2012-07-12 95 views
0

我的目标是在Windows Mobile设备上使用相机拍摄一张照片,并将该图像转换为单色位图,以便它可以使用蓝牙打印机在蓝牙打印机上打印。 .NET Compact Framework。我发现我在这里寻找答案:在.NET Compact Framework上将位图转换为单色后的纯黑色图像

Convert image to 1 bpp bitmap in .net compact framework

当我加入这个代码,并与我拿着摄像机的图像(.JPG文件大小约为300K)测试,我通过了图像进入代码来自上面的stackoverflow解决方案中的代码,并且完成时没有错误。查看位图时,它是纯黑色的图像。

传递到代码中的原始位图是否需要某个分辨率或是否存在其他限制?用相机拍摄的原始图像是黑色和白色开始。

+0

原始图像实际上是黑白的,还是灰度?因为它可能会将任何颜色的东西都当作黑色处理,只有纯白色的处理才是白色的。 – 2012-07-12 18:24:50

+0

是的,这是我的猜测,它实际上是一个“彩色”图像,可能不包含单个白色像素,但我认为它应该将任何图像转换为单色。 – 2012-07-12 18:39:53

+0

如果这是真的,我认为你必须在1BPP DeviceContext上执行'DrawImage'之前先根据阈值手动擦洗图像。 [Bitmap.LockBits](http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx),然后遍历每个像素并将其设置为白色或黑色可能是唯一的方法。你必须决定在哪一点像素有足够的颜色称之为黑色。 – 2012-07-12 18:50:21

回答

0

这是一个棘手的问题。为了获得合理的结果,你真正需要做的是实现一种抖动算法,该算法允许打印机根据原始像素的“黑色”如何按比例划分白色和黑色点。如果将算法限制为仅将每个像素转换为白色或黑色,则输出不会很好地表示您拍摄的原始照片。通过抖动,您可以分析输入中的每个像素,并根据输入像素的黑暗程度调整输出中的周围像素。

常见的抖动实行的是弗洛伊德 - 斯坦伯格算法,描述它的基本形式在这里:

Floyd-Steinberg Dithering

地段的详细信息就在那里,如果你谷歌它。

因为这不是一个简单的算法,所以要准备花上一个下午才能让它变得恰到好处。

相关问题