关于Android平台下png图片渐变失真的解决办法

本文作者在测试应用时遇到png渐变背景显示严重失真的问题,尝试了网上多种解决方法如设置硬件加速、修改XML背景等均无效。最终发现32位的png图片能显著减少波纹,通过将所有图片替换为32位png,基本解决了这个问题。注意,此方法优化显示但并非完全完美。制作32位png的一个技巧是,对于不带透明通道的图片,可以将任意像素透明度设为99%再保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原创文章,转载请注明出处:http://blog.youkuaiyun.com/jyxpm/article/details/8562583

   

        前几天在测试应用的时候发现,把渐变png做为背景的时候,在模拟器或设备上运行均出现光晕、波纹状的轮廓图,图片显示严重失真,困惑了很久。首先在网上搜解决方案,无外乎有下面几种办法:


1、在Activity的onCreate()函数中,super.onCreate()和setContentView()之间添加:

getWindow().setFormat(PixelFormat.RGBA_8888);  //或者PixelFormat.TRANSLUCENT
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

或者用代码添加背景图片:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap gradient = BitmapFactory.decodeResource(getResources(), R.drawable.splash, options);
findViewById(R.id.linear).setBackgroundDrawable(new BitmapDrawable(gradient));


RGBA_8888为android的一种32位颜色格式,R,G,B,A分别用八位表示,Android默认格式是PixelFormat.OPAQUE,其是不带Alpha值的。设置之后可以看到图片的显示效果就和在PC上看到一样,不会出现带状的轮廓线了。
注:测试无效,可能跟我的程序有关。

2、第二种方法比较麻烦,就是将你需要要显示的view设置为一个surfaceview,这样也可以达到同样的显示效果,但这种方法代价较大,不推荐。
注:这个方法网上有源码,比较麻烦,没有测试。

3、如果以上方法依然不能实现去除手机中图片显示渐变存在光晕效果的话,你可以适一下在PS里的处理方法:“The best way to resolve this is to add some "noise" to your image asset in Photoshop or Paint.NET”我用了这个方法数值设置的是1.5。算是解决了问题。虽然手机开发的很多情况下会使用.png格式,但是当图片大小与质量并不匹配的时候,或许可以换一种文件格式,在这里建议使用jpg的,压缩大小与质量相衬。
注:可以解决问题,唯一不好的是图片质量受损,如果对图像质量要求没那么高,可以使用这种方法。noise参数设置为0.5-1.5之间较合适。

4、经过上面三种方法均无效之后,本人测试了N种图片格式,包括jpg、png-8、png-24等,甚至修改了图片参数,还是不能解决问题。最后研究了一下png,发现32位的png图片波纹明显减少,因此把所有图片替换成32位png,问题基本解决。

注:可以大幅度优化图片显示,不是100%完美。32位png制作窍门:如果带透明通道的直接保存就是32位的,没有透明通道的可以随便选一个像素,把像素透明度设置为99%,重新保存,OK。

32位png制作窍门:如果带透明通道的直接保存就是32位的,没有透明通道的可以随便选一个像素,把这个像素透明度设置为99%,重新保存,OK。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值