Android编辑位图通道

可以通过extractAlpha()来访问给定位图的alpha通道,但是我还没有find任何方法来真正设置位图的alpha通道。

如何将多个灰度图像重新组合为Android的位图?

Solutions Collecting From Web of "Android编辑位图通道"

将单独的频道重新组合到ARGB图像中是完全可能的。 你只需要灰度通道图像和一个你想要的alpha通道的图像 – 请注意,这不是一个不透明的灰度图像,而是一个图像与你想要的alpha 。 然后使用合适的PorterDuffXfermode将每个通道Paint到空白的黑色位图上。

 // have your 3 channel grayscales and 1 alpha bitmap loaded by this point Paint redPaint = new Paint(); redPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN)); redPaint.setShader(new BitmapShader(redChanImg, TileMode.CLAMP, TileMode.CLAMP)); redPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, Mode.DARKEN)); Paint greenPaint = new Paint(); greenPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN)); greenPaint.setShader(new BitmapShader(greenChanImg, TileMode.CLAMP, TileMode.CLAMP)); greenPaint.setColorFilter(new PorterDuffColorFilter(Color.GREEN, Mode.DARKEN)); Paint bluePaint = new Paint(); bluePaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN)); bluePaint.setShader(new BitmapShader(blueChanImg, TileMode.CLAMP, TileMode.CLAMP)); bluePaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, Mode.DARKEN)); Paint alphaPaint = new Paint(Paint.ANTI_ALIAS_FLAG); alphaPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); c.setBitmap(resultImage); c.drawRect(0, 0, width, height, redPaint); c.drawRect(0, 0, width, height, greenPaint); c.drawRect(0, 0, width, height, bluePaint); c.drawBitmap(alphaImg, 0, 0, alphaPaint); //save off resultImage, display it, etc... 

用上面的代码和下面的4个图像(分别是红色,绿色,蓝色和alpha): 替代文字替代文字替代文字替代文字

我们得到以下结果:


替代文字


只是一个简单的说明:红色的椭圆形是一个透明的背景上的不透明的红色椭圆形 – 这个颜色并不重要,但alpha

操纵位图是一件非常简单的事情,何时直接访问像素(字节)。 要在Android中做到这一点,你可以通过这种方式做到这一点

 ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); byte[] b = bos.toByteArray(); 

现在你可以做任何image processing,变形或你喜欢的组合。

我希望这是你正在寻找的。

你用帆布试过了吗? 以下看起来像一个黑客,但也许它会工作。 我没有自己testing过。

  Bitmap bitmap; int color = bitmap.getPixel(1, 123); Rect rect = new Rect(1,123,2,124); Canvas c = new Canvas(bitmap); c.clipRect(rect); c.drawARGB(50, Color.red(color), Color.green(color), Color.blue(color));