我想將位圖打印到移動藍牙打印機(Bixolon SPP-R200)--SDK不提供用於打印內存的direkt方法圖片。所以我想這樣轉換一個位圖:Android:將位圖轉換爲單色位圖(每像素1位)
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
到單色位圖。我使用Canvas在上面給出的位圖上繪製黑色文本,效果很好。但是,當我將上述位圖轉換爲ByteArray時,打印機似乎無法處理這些字節。我懷疑我需要一個像素每像素一位(像素將是白色= 1或黑色= 0)。
因爲似乎沒有方便,開箱即用的方式做到這一點,我有一個想法是使用:
bitmap.getPixels(pixels, offset, stride, x, y, width, height)
獲取像素。我想,我不得不使用它,如下所示:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
但是 - 我不知道的幾件事:
- 在的getPixels - 是否有意義簡單地通過寬度「大步」的說法?
- 我想我必須評估每個像素的顏色信息,並將其切換爲黑色或白色(並且我會將此值寫入新的目標字節數組,我將最終傳遞給打印機)?
- 如何最好地評估每個像素顏色信息以決定它應該是黑色還是白色? (呈現的位圖在白色背景上是黑色的疼痛)
這種方法是否有意義?有更容易的方法嗎?僅將位圖黑色化爲白色是不夠的,主要問題是將每個像素的顏色信息減少到一位。
UPDATE
至於建議由魯本我的位圖轉換到一個單色位圖。然後我會遍歷每個像素:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// Iterate over height
for (int y = 0; y < height; y++) {
int offset = y * height;
// Iterate over width
for (int x = 0; x < width; x++) {
int pixel = bitmap.getPixel(x, y);
}
}
流便建議將「讀取每個32位像素的最低字節」 - 這將涉及到我關於如何評價像素的顏色問題。我在這方面的最後一個問題:我簡單地做這個拿到最低字節:
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
我有這個QA出演,因爲我工作的一個類似的概念關於以編程方式操作數組變成單色位圖。我有一個問題及其最終答案在這裏:http://stackoverflow.com/questions/17918978/plot-an-array-into-bitmap-in-cc-for-thermal-printer如果這有助於人們,請給我發電子郵件和我會爲這個問題提出一個合適的答案。 – 2013-12-28 09:16:01
爲什麼使用GetPixels將所有像素加載到單個數組中......然後通過位圖AGAIN調用單個GetPixel調用(可能效率最低的方式)嵌套循環?只需循環訪問原始數組,然後使用SetPixels將整個陣列重新推回到位圖中。 – 2016-03-14 16:17:06
@ClintStLaurent好點 - 代碼真的很老xD - 我甚至不認爲我們已經以這種形式使用它了,但正如你指出的那樣,它寫在那裏的方式效率很低。隨意根據您的建議進行編輯。 – AgentKnopf 2016-03-15 19:20:29