带有PorterDuff.Mode.DST_IN的android drawBitmap,应该透明的区域变成黑色

标签 android canvas bitmap draw

我正在尝试绘制带有特定形状 mask 的图像。 我正在使用 Facebook 的库 Fresco,这里是代码:

    ImageRequest request = builder.setPostprocessor(new BasePostprocessor() {
        @Override
        public String getName() {
            return "ChatViewImageProcessor";
        }

        @Override
        public void process(Bitmap bitmap) {
            int bitmap_width = bitmap.getWidth();
            int bitmap_height = bitmap.getHeight();
            ViewGroup.LayoutParams params = iv.getLayoutParams();
            if (width == -1 && height == -1) {//not relavant with question
                horizontal[0] = bitmap_width >= bitmap_height;
                params.width = horizontal[0] ? max_image_size : (int) (max_image_size * 1.0 * bitmap_width / bitmap_height);
                params.height = (horizontal[0] ? (int) (max_image_size * 1.0 * bitmap_height / bitmap_width) : max_image_size);

            }

            Bitmap temp = Bitmap.createBitmap(params.width, params.height, Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(temp);
            if (bg != null) {
                bg.setBounds(0, 0, params.width, params.height);
                bg.draw(canvas);
            }
            Logger.out("temp[0,0]:" + Util.getColorNote(temp.getPixel(0, 0), true));
            canvas = new Canvas(bitmap);

            Rect src = new Rect(0, 0, temp.getWidth(), temp.getHeight());
            Rect dst = new Rect(0, 0, bitmap_width, bitmap_height);
            canvas.drawBitmap(temp, src, dst, paint);//<----------problem here

            temp.recycle();
            Logger.out("result[0,0]:" + Util.getColorNote(bitmap.getPixel(0, 0), true));
        }
    }).build();

    PipelineDraweeController controller = (PipelineDraweeController)
            Fresco.newDraweeControllerBuilder()
                    .setImageRequest(request)
                    .setOldController(iv.getController())
                    .build();
    iv.setController(controller);

此代码在 5.0.2 上运行良好... 我不能在这里发布图片,请参阅 http://i.stack.imgur.com/9DBbj.jpg

但在 4.4.4 和 4.1.2 上失败。 我不能在这里发布图片,请参阅 http://i.stack.imgur.com/8wbLp.jpg

我还在 5.0.2 上打印了左上角像素的“temp”颜色并裁剪了“bitmap”,即#00000000 和#00000000,在 4.4.4 和 4.1.2 上它们是#00000000 和#FF000000

最佳答案

很高兴在 Fresco 的 github 问题页面上找到答案 here

正如它所说,我只需要打电话

    bitmap.setHasAlpha(true);

    public void process(Bitmap bitmap)

关于带有PorterDuff.Mode.DST_IN的android drawBitmap,应该透明的区域变成黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32137168/

相关文章:

android - 旋转大尺寸位图的最快方法

android - 使用Android MediaCodec编码时修改音频音调/速度

javascript - Webgl 动画纹理性能与 canvas drawImage 性能

android - 在 Android 上创建服务有多昂贵?

javascript - 使用 Canvas 引擎和平铺 map 编辑器获取 "Uncaught TypeError: Cannot read property ' firstgid' of undefined"

javascript - 为什么我的 paperjs 应用程序占用如此多的 CPU 资源并且速度变慢?

unity-game-engine - 来自 byte[] 数组的位图

winapi - 基于 Win32 对话框的无边框窗口,具有位图背景和视觉样式

android - SQLite 异常 : no such column: (code 1)

android - 如何创建一个简单的自定义 View ?