在项目中,我们拿到的网络图可能是透明的,但又要求我们显示白色背景。
当然处理的方法很多,如给控件添加背景色,或者通过两个控件叠加来显示等等,这里我记录我使用的别的方法。
方法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中为透明PNG图片添加白色底色的方法。方法1适用于纯色图片,通过遍历像素点进行颜色替换;方法2则是利用jpg的不透明特性,先转换为jpg保存到本地,再读取显示并删除本地文件。这两种方法避免了直接在UI线程中进行耗时操作,适合项目中快速实现需求。
&spm=1001.2101.3001.5002&articleId=110181036&d=1&t=3&u=4cb516bbc28042aabde92626df94868f)
3905

被折叠的 条评论
为什么被折叠?



