【问题标题】:Solid black image after converting bitmap to monochrome on .NET Compact Framework在 .NET Compact Framework 上将位图转换为单色后的纯黑色图像
【发布时间】:2012-07-12 13:46:04
【问题描述】:

我的目标是使用 Windows Mobile 设备上的相机拍照并将该图像转换为单色位图,以便可以使用 .NET Compact Framework 在蓝牙打印机上打印。我在这里找到了我正在寻找的答案:

Convert image to 1 bpp bitmap in .net compact framework

当我添加此代码并使用我用相机拍摄的图像(大小约为 300K 的 .jpg 文件)进行测试时,我将该图像从上述 stackoverflow 解决方案中的代码传递到代码中,并且它没有错误地完成。查看位图时,它是一个纯黑色的图像。

传入代码的原始位图需要一定的分辨率还是有其他限制?用相机拍摄的原始图像一开始是黑白的。

【问题讨论】:

  • 原始图像实际上是黑白的,还是灰度的?因为它可能会将任何带有一丝色彩的东西视为黑色,而只有纯白色视为白色。
  • 是的,这是我的猜测,它实际上是一个“彩色”图像,可能不包含单个白色像素,但我认为它应该将任何图像转换为单色。
  • 如果这是真的,我认为您必须先根据阈值手动清理图像,然后再对 1BPP DeviceContext 执行DrawImageBitmap.LockBits 然后循环遍历每个像素并首先将其设置为白色或黑色可能是唯一的方法。您必须决定在哪一点像素有足够的颜色将其称为黑色。
  • 我想你可能想要 256 色灰度作为结果,而不是 1bpp。 1bpp 意味着一个像素是黑色或白色,没有中间,非常适合文本文档。对于一张照片,它看起来会很糟糕。

标签: c# bitmap windows-mobile compact-framework


【解决方案1】:

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

常见的抖动实现是 Floyd-Steinberg 算法,在此处以其基本形式进行描述:

Floyd-Steinberg Dithering

如果你用谷歌搜索的话,会有更多信息。

由于实现它并不是一个简单的算法,因此请准备好花一个多下午的时间来让它恰到好处。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多