25

ビットマップをモバイル 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;
4

4 に答える 4

32

ColorMatrix を使用して、画像をモノクロの 32bpp に変換できます。

Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmpMonochrome);
ColorMatrix ma = new ColorMatrix();
ma.setSaturation(0);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(ma));
canvas.drawBitmap(bmpSrc, 0, 0, paint);

これにより、カラーからモノクロへの変換が簡素化されます。これで、getPixels() を実行して、各 32 ビット ピクセルの最下位バイトを読み取ることができます。128 未満の場合は 0、それ以外の場合は 1 です。

于 2012-02-21T12:52:25.787 に答える
12

さて、このスレッドに返信するのはかなり遅いと思いますが、私は時々このようなものに取り組んでいて、jpgまたはpng画像を1bpp.bmpに変換する独自のライブラリを構築することにしました。1bppイメージを必要とするほとんどのプリンターは、このイメージをサポートします(それらの1つでテストされています:))。ここでは、ライブラリと、それを使用してモノクロのシングルチャンネル画像を作成するテストプロジェクトを見つけることができます。自由に変更してください..:)

https://github.com/acdevs/1bpp-monochrome-android

楽しみ..!!:)

于 2013-03-20T09:19:55.350 に答える
9

各ピクセルを HSV 空間に変換し、その値を使用してターゲット イメージのピクセルを黒にするか白にするかを決定する必要があります。

  Bitmap bwBitmap = Bitmap.createBitmap( bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565 );
  float[] hsv = new float[ 3 ];
  for( int col = 0; col < bitmap.getWidth(); col++ ) {
    for( int row = 0; row < bitmap.getHeight(); row++ ) {
      Color.colorToHSV( bitmap.getPixel( col, row ), hsv );
      if( hsv[ 2 ] > 0.5f ) {
        bwBitmap.setPixel( col, row, 0xffffffff );
      } else {
        bwBitmap.setPixel( col, row, 0xff000000 );
      }
    }
  }
  return bwBitmap;
于 2016-07-28T11:37:30.703 に答える