1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android 给透明png图片添加白色底色(修改像素点的形式)

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

时间:2020-06-13 08:23:21

相关推荐

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

在项目中,我们拿到的网络图可能是透明的,但又要求我们显示白色背景。

当然处理的方法很多,如给控件添加背景色,或者通过两个控件叠加来显示等等,这里我记录我使用的别的方法。

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

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

/*** 建议只能是纯色png图片,不然会造成图片像素或显示极度模糊* 将bitmap中的某种颜色值替换成新的颜色* @param oldBitmap* @param oldColor* @param newColor* @return*/public static Bitmap replaceBitmapColor(Bitmap oldBitmap,int oldColor,int newColor){//相关说明可参考 http://xys289187120./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>() {@Overridepublic 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); //复制出一个新的BitmapCanvas canvas=new Canvas(outB); //给新的Bitmap 添加一个白色的画布canvas.drawColor(Color.WHITE);canvas.drawBitmap(resource, 0, 0, null);try {FileOutputStream out = new FileOutputStream(jpg); //保存到本地,格式为JPEGif (press(pressFormat.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>() {@Overridepublic void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {Utils.saveAndGetImage(resource,holder.image,images.get(arg1),"PhotoView");}});

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。