ColorMatrixColorFilterを使用してビットマップのカラーピクセルを変更するのに問題があります。ローカルファイルシステムのビットマップ(jpg)を使用すると、機能します。ただし、バッファから作成されたビットマップを使用すると、キャンバスに何も描画されません。
特に、次のコードを使用してColorMatrixを作成しています。
float matrix[] = new float[] {
0, 0, 1, 0, 0,
0, 1, 0, 0, 0,
1, 0, 0, 0, 0,
0, 0, 0, 1, 0
};
rbSwap = new ColorMatrix(matrix);
paint = new Paint(Paint.FILTER_BITMAP_FLAG);
paint.setColorFilter(new ColorMatrixColorFilter(rbSwap));
上記は、赤と青の色を入れ替えるために使用されるColorMatrixColorFilterを作成するために使用されます。
次のコードを使用してビットマップを作成すると、機能します。
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.picture);
次のコードを使用してビットマップを作成すると、キャンバスに何も描画されません。
bitmap = Bitmap.createBitmap((int) width, (int) height,
Bitmap.Config.ARGB_8888);
srcBuffer = ByteBuffer.wrap(data);
srcBuffer.rewind();
bitmap.copyPixelsFromBuffer(srcBuffer);
私のonDraw()は次のようになります。
public void onDraw(Canvas canvas) {
canvas.drawBitmap(spicebmp, offsetX, offsetY, paint);
}
カラーフィルターを設定しないと、ビットマップがキャンバスにレンダリングされます。カラーフィルターを設定すると、それは単に黒い画面になります-何もレンダリングされていないように見えます。バッファを介して作成しているビットマップの代わりにjpgビットマップを使用すると、赤と青が入れ替わって描画されます。
行列を単位行列と同じになるように変更しましたが、ビットマップは正しくレンダリングされます。マトリックス内の単精度浮動小数点数(1sから.5sまたは0など)を変更しても、何も描画されません。
また、ビットマップにビットマップを表すのに十分な「バイト」があることを確認しました。ビットマップ.byteCount()== srcBuffer.limit()はtrueでした-したがって、バッファー内のバイトは、渡す幅/高さに対して存在する必要があるバイトと同じでした。
onDraw中の例外に対してtry/catchを配置し、logcat出力に流し込みましたが、そこには何も表示されませんでした。Androidのビットマップ描画コードをざっと見て、次のことを確認しました。
// nothing to draw
if (fClip->isEmpty() ||
bitmap.width() == 0 || bitmap.height() == 0 ||
bitmap.getConfig() == SkBitmap::kNo_Config ||
(origPaint.getAlpha() == 0 && origPaint.getXfermode() == NULL)) {
return;
}
コアのC++コードをトレースする機能がないため、これがトリガーされているかどうかがわかりません。しかし、ビットマップの幅と高さが両方ともゼロ以外(800と600)であり、作成時にARGV_8888タイプに設定され、ロードされたjpgの両方にまったく同じペイントオブジェクトが使用されていることを知っています。ディスク(動作するもの)から、およびcopyPixelsFromBuffer()を使用して作成したもの。
だから私は自分が何を間違っているのかわかりません。colorFilteringと互換性のないのはビットマップ内のフラグまたはプロパティであると思いますが、これはARGB_8888タイプの適切なサイズの単純なByteBufferにすぎません。そしてもちろん、まったく同じコード(ペイントオブジェクトなど)を使用してフィルターを設定します。
では、ビットマップで他に何かする必要があることはありますか?ColorMatrix / Filterを使用しますか?