2012-07-12 92 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

地段的詳細信息就在那裏,如果你谷歌它。

因爲這不是一個簡單的算法,所以要準備花上一個下午才能讓它變得恰到好處。

相關問題