ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-无法透明位图图像的像素

2019-10-28 03:26:44  阅读:152  来源: 互联网

标签:alpha-transparency bitmap android


我正在使用位图图像,其透明部分用洋红色着色(在某些语言中,可以将颜色设置为透明).我尝试对原始位图图像中的洋红色透明像素进行处理.

我从SD卡加载位图:

            Bitmap bitmap = BitmapFactory.decodeFile(myImagePath);

将其复制到另一个位图以使其可变:

            Bitmap bitmap2 = bitmap.copy(Bitmap.Config.ARGB_8888,true);

然后逐像素进行扫描,以找到洋红色的像素,并尝试更改其透明度.

            for(int x=0;x<bitmap2.getWidth();x++){
                for(int y=0;y<bitmap2.getHeight();y++){
                    if(bitmap2.getPixel(x, y)==Color.rgb(0xff, 0x00, 0xff))
                    {
                        int alpha = 0x00;
                        bitmap2.setPixel(x, y , Color.argb(alpha,0xff,0xff,0xff));  // changing the transparency of pixel(x,y)
                    }                           
                }
            }

但是那些我希望变得透明的像素会转换为黑色.通过更改alpha,我发现最终颜色从argb()中提到的颜色(未提及alpha)变为黑色.例如,Color.argb(0xff,0xff,0xff,0xff)变为白色,Color.argb(0x80,0xff,0xff,0xff)变为灰色,而Color.argb(0x00,0xff,0xff,0xff)变为黑色.

我不明白这是怎么回事.

可能没有alpha通道,我应该先设置/定义它吗?如果是,如何?

编辑1:

根据Der Gol … lum的评论,我修改了我的代码:

    Paint mPaint = new Paint();
    mPaint.setAlpha(0);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    mPaint.setAntiAlias(true);

        Bitmap bitmap = BitmapFactory.decodeFile(myBackImagePath).copy(Bitmap.Config.ARGB_8888 , true);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(bitmap, 0, 0, mPaint);

        if(bitmap.getPixel(0, 0)==Color.rgb(0xff, 0x00, 0xff))
        {
            for(int x=0;x<bitmap.getWidth();x++){
                for(int y=0;y<bitmap.getHeight();y++){
                    if(bitmap.getPixel(x, y)==Color.rgb(0xff, 0x00, 0xff))
                    {
                        bitmap.setPixel(x, y,Color.TRANSPARENT);
                    }                           
                }
            }

但是结果大致相同.使用不同的PorterDuffModes会导致整个位图透明或使目标像素变黑:

有人有什么主意吗?

解决方法:

我终于可以找到问题了.
我的png图像没有Alpha通道,或者它们的Alpha通道未激活.
解决此问题的方法是添加:

         bitmap.setHasAlpha(true); 

它按我的预期工作.

标签:alpha-transparency,bitmap,android
来源: https://codeday.me/bug/20191028/1949338.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有