如果我使用ALPHA_8加载位图,它将创建一个具有灰度和透明度的位图。这正是我想要的。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ALPHA_8;
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_bitmap, options);
我想合并两个位图。为此,我使用ALPHA_8创建一个画布,并在画布上绘制相同的位图。
但结果却不同。它会保留alpha,但灰色的一切都是黑色的。所以我只看到轮廓而没有灰度。
resultBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ALPHA_8);
resultCanvas = new Canvas(resultBitmap);
resultCanvas.drawBitmap(bitmap, 0, 0, null);
我找到了2个解决方法。
A)使用ARGB_8888而不是ALPHA_8,但这会产生更大的图像。
resultBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
B)使用颜色矩阵将图像转换为alpha通道,但这会使灰色变为半透明,而不是灰度。
float[] matrix = new float[] {
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
-1f, 0, 0, 1f, 0};
Paint grayToAlpha = new Paint();
grayToAlpha.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(matrix)));
resultCanvas.drawBitmap(bitmap, 0, 0, grayToAlpha);
两种解决方法都不完美。所以我的问题是:
有没有办法在画布上获得与位图相同的结果?
或者
有没有更好的方法将两个位图与ALPHA_8合并在一起?