ビットマップをモバイル Bluetooth プリンター (Bixolon SPP-R200) に印刷したいのですが、SDK はメモリ内の画像を印刷するための直接的な方法を提供していません。そこで、ビットマップを次のように変換することを考えました。
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
モノクロ ビットマップに。キャンバスを使用して上記のビットマップに黒いテキストを描画していますが、これはうまく機能します。ただし、上記の Bitmap を ByteArray に変換すると、プリンターはそれらのバイトを処理できないようです。ピクセルあたり 1 ビットの配列が必要だと思います (ピクセルは白 = 1 または黒 = 0 になります)。
それを行うための便利な方法がないように思われるので、私が持っていた1つのアイデアは使用することでした:
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 では、単純に幅を「Stride」引数として渡すのは理にかなっていますか?
- 各ピクセルの色情報を評価し、それを黒または白に切り替える必要があると思います(そして、最終的にプリンターに渡す新しいターゲットバイト配列にこの値を書き込みます)?
- 黒か白かを判断するために、各ピクセルの色情報をどのように評価すればよいでしょうか? (レンダリングされたビットマップは、白い背景に黒い痛みです)
このアプローチはまったく理にかなっていますか? もっと簡単な方法はありますか?ビットマップを白黒にするだけでは不十分です。主な問題は、各ピクセルの色情報を 1 ビットに減らすことです。
アップデート
Reuben が提案したように、まずビットマップをモノクロ ビットマップに変換します。次に、各ピクセルを反復処理します。
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);
}
}
Reuben は、「各 32 ビット ピクセルの最下位バイトを読み取る」ことを提案しました。これは、ピクセルの色を評価する方法に関する私の質問に関連しています。この点に関する私の最後の質問:これを行うだけで最下位バイトを取得できますか?
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;