【问题标题】:Android Edit Bitmap ChannelsAndroid 编辑位图通道
【发布时间】:2011-06-01 09:49:19
【问题描述】:

可以使用extractAlpha() 访问给定位图的 Alpha 通道,但我无法找到任何方法来实际设置位图的 Alpha 通道。

如何在 Android 中将多个灰度图像作为通道重新组合为位图?

【问题讨论】:

    标签: java android bitmap paint color-channel


    【解决方案1】:

    很可能将单独的通道重新组合回 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 很重要

    【讨论】:

    • 啊!这正是我需要的。有点复杂,但看起来可行。
    【解决方案2】:

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

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

    现在您可以进行任何您喜欢的图像处理、转换或组合。

    我希望这就是你要找的。​​p>

    【讨论】:

    • 不完全。我的位图处于完全可编辑的状态。我可以应用过滤器、转换等。我不知道如何编辑单个通道,而不是一次编辑整个图像。
    【解决方案3】:

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

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

    【讨论】:

    • 或使用缓冲区并直接从那里读/写颜色 bitmap.copyPixelsToBuffer(Buffer dst)
    • 这当然适用于简单的操作,但是逐像素访问太慢了,因为我需要实时完成。
    • 我明白了,您想使用灰度图片作为其他图片的 Alpha。我没有看到现成的方法。您可能必须直接访问缓冲区并自己在位级别上进行操作。
    • 查看过Android源码吗?可能有一种硬件加速方法可以做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多