Android 给透明png图片添加白色底色(修改像素点的形式)

在项目中,我们拿到的网络图可能是透明的,但又要求我们显示白色背景。
当然处理的方法很多,如给控件添加背景色,或者通过两个控件叠加来显示等等,这里我记录我使用的别的方法。

方法1(此方法仅适用于纯色图片。相信我,不是纯色图片不要使用,不然上线后你可能要卷铺盖走人了):

变量每一个像素点,把对应的旧颜色替换为新的颜色

/**
     * 建议只能是纯色png图片,不然会造成图片像素或显示极度模糊
     * 将bitmap中的某种颜色值替换成新的颜色
     * @param oldBitmap
     * @param oldColor
     * @param newColor
     * @return
     */
    public static Bitmap replaceBitmapColor(Bitmap oldBitmap,int oldColor,int newColor)
    {
        //相关说明可参考 http://xys289187120.blog.51cto.com/3361352/657590/
        Bitmap mBitmap = oldBitmap.copy(Bitmap.Config.ARGB_8888, true);
        //循环获得bitmap所有像素点
        int mBitmapWidth = mBitmap.getWidth();
        int mBitmapHeight = mBitmap.getHeight();
        G.look("mBitmapWidth: "+mBitmapWidth);
        G.look("mBitmapHeight: "+mBitmapHeight);
        for (int i = 0; i < mBitmapHeight; i++) {
            for (int j = 0; j < mBitmapWidth; j++) {
                //获得Bitmap 图片中每一个点的color颜色值
                //将需要填充的颜色值如果不是
                //在这说明一下 如果color 是全透明 或者全黑 返回值为 0
                //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000
                //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
                int color = mBitmap.getPixel(j, i);
                //将颜色值存在一个数组中 方便后面修改
                if (color == oldColor) {
                    mBitmap.setPixel(j, i, newColor);  //将白色替换成透明色
                }
            }
        }
        return mBitmap;
    }

调用利用Glide显示图片时调用该方法即可:

Glide.with(context)
				.asBitmap()
				.load(images.get(arg1))
				.into(new SimpleTarget<Bitmap>() {
					@Override
					public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
						Bitmap bitmap = replaceBitmapColor(Color.TRANSPARENT,Color.WHITE);
						holder.image.setImageBitmap(bitmap);
					}
				});
方法2(利用jpg不透明的原则,先把图片转换成jpg下载到本地,再从本地读取显示并删除本地文件):

方法

 /**
     * 给透明图片添加白色底色,转换为jpg格式保存到本地后并获取本地图片并显示,然后删除本地图片
     * @param resource
     * @param view
     * @param url
     */
    public static void saveAndGetImage(Bitmap resource,View view,String url,String type){
        //由于图片有透明背景,但又要求显示时添加白色背景。此处的处理:
        //1.复制出一个新的Bitmap,然后给新的Bitmap添加一个白色的背景画布,然后把这个图转换为jpg下载到本地。
        //2.从手机本地取出该图片显示即可。
        File jpg = new File(C.getDownloadPath() + G.urlToFileName(url));
        Bitmap outB=resource.copy(Bitmap.Config.ARGB_8888,true); //复制出一个新的Bitmap
        Canvas canvas=new Canvas(outB);   //给新的Bitmap 添加一个白色的画布
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(resource, 0, 0, null);
        try {
            FileOutputStream out = new FileOutputStream(jpg); //保存到本地,格式为JPEG
            if (outB.compress(Bitmap.CompressFormat.JPEG, 100, out)) {
                out.flush();
                out.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //从本地获取保存的图片并显示
        Bitmap bitmap = BitmapFactory.decodeFile(C.getDownloadPath() + G.urlToFileName(url),null);
        if (type.equals("PhotoView")){
            photoView = (PhotoView) view;
            photoView.setImageBitmap(bitmap);
        }

        //删除本地图片
        File file = new File(C.getDownloadPath() + G.urlToFileName(url));
        // 如果已经存在则不需要下载
        if (file != null && file.exists()) {
            file.delete();
            return;
        }
    }

调用:

Glide.with(context)
				.asBitmap()
				.load(images.get(arg1))
				.into(new SimpleTarget<Bitmap>() {
					@Override
					public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
						Utils.saveAndGetImage(resource,holder.image,images.get(arg1),"PhotoView");

					}
				});

本来上面的这样耗时操作是不能放到主线程调用的。但是由于我们利用的是Glide来显示图片,Glide已经另外创建线程了,所以不用我们自己来弄。

你可能感兴趣的:(Android,Java,给透明png图添加底色,Bitmap给png添加底色,android,替换png底色)