可以使用给定位图的alpha频道 extractAlpha(), ,但是我找不到任何方法来实际设置位图的alpha频道。

如何将多个灰度图像重组为通道与Android的位图?

有帮助吗?

解决方案

很有可能将单独的通道重组回到ARGB图像中。您只需要灰度频道图像和带有您想要的alpha频道的图像 - 请注意,这是 不是 不透明的灰度图像,但是 α 你要。然后您用一个 Paint 使用适当的 PorterDuffXfermode 在空白的黑色填充位图上。

// 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):alt textalt textalt textalt text

我们得到以下结果:


alt text


快速注意:红色椭圆形是透明背景上不透明的红色椭圆形 - 颜色对此并不重要,但是Alpha确实如此

其他提示

操纵位图是一件很简单的事情,何时直接访问像素(字节)。为了在Android中这样做,您可以通过此批准做到这一点

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

现在,您可以执行您喜欢的任何图像操纵,变形或组合。

我希望这就是您想要的。

您是否尝试过画布?以下看起来像是黑客,但也许会起作用。我没有自己测试过。

    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));

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top