扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
因为png格式的文件支持透明度,android中可以存在四种png后缀的image文件
成都创新互联公司为企业提供:品牌网站制作、网络营销策划、微信小程序开发、营销型网站建设和网站运营托管,一站式网络营销整体服务。实现不断获取潜在客户之核心目标,建立了企业专属的“营销型网站建设”,就用不着再为了获取潜在客户而苦恼,相反,客户会主动找您,生意就找上门来了!
1.标准PNG: (ex.应用默认的icon.png)
符合PNG-8标准的PNG图片, 只能做图片, 不能放缩.
2.Android打包处理后的9.png: (ex.应用APK中打包的9.PNG)
为了保证占用空间小,android在资源中删除了标准PNG的大量冗余信息,去除了周边的空白像素,减少了IDAT数据段,
在打包成APK的时候,里面的文件就是不可放缩的9.png, 虽然后缀名还是9.png,但是已经没有放缩功能,并且把边界多的两个像素也去除了.
3.Android不可放缩的9.png:
在drawable中可以找到9.png图片,但是使用Draw 9-patch软件打开会报错,但是可以在drawable中使用,
这些文件只是删除了冗余信息,并且加上了边界的两个像素点,
并没有添加可放缩的flag到文件中,这些文件只能作为打包后的9.PNG使用(但是size会小一些),不能放缩和做背景.
4.Android可放缩的9.png:
可以使用Draw 9-patch软件打开,不会报错,在drawable中使用,android会根据设置的黑色像素点来进行放缩.
有添加可缩放的flag到文件中,可以做为View的背景或者普通的图片显示.在做背景时,可以进行拉伸和放缩.
在做非背景时,比如像ImageView这类设置src图片则不随view变化,按其自身大小显示部分或全部.
另: 对9.png后缀文件的解析逻辑及可放缩chunk检查的逻辑 Images.cpp
对9.PNG判断函数入口: Drawable.java中对”nine-patch”字段的判断
如果你只是觉得程序背景图片大的话 这个应该是美工的问题 找个专业的美工设计下就Ok的
如果是程序中想压缩图片的话 网上的方法很多
下面代码是将图片按比例大小压缩方法(根据Bitmap图片压缩)
private Bitmap comp(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
if( baos.toByteArray().length / 10241024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = 800f;//这里设置高度为800f
float ww = 480f;//这里设置宽度为480f
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;//be=1表示不缩放
if (w h w ww) {//如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w h h hh) {//如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be = 0)
be = 1;
newOpts.inSampleSize = be;//设置缩放比例
newOpts.inPreferredConfig = Config.RGB_565;//降低图片从ARGB888到RGB565
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
}
【ps:看你自己的需要吧 给个地方做参考 你也可以搜索下 其他的方法 】
android开发过程中,有各种各样的图片,不同的图片有不同的大小、用途,有的是作为背景图片,有的是作为一个小的图标,不同用途、不同场景的图片使用格式最好按照不同格式的优缺点来确定。
1、首先来说,同样分辨率的图片,png的要比jpg的大好多, 做android对图片的大小很敏感,所以第一感觉是用jpg,不用png。之所以png比jpg大是因为,png是无损压缩的,而jpg是有损压缩,但是在比如说一张背景图,由于手机会对png的图片进行硬件加速,所以同一张图片的png格式和jpg格式,png的加载速度是比jpg快的,但是如果对包大小的诉求大于对加载速度诉求的话,jpg又比png有优势。
2、但是有的情况下jpg是比png好的,jpg相对于png的优势是小!小!小,因此一些需要动态网络获取加载的图片,比如说Splash页面,就要使用jpg格式的图片了。
3、小的图标,由于对其清晰度要求高,并且小图标也不是很大,因此最好用png格式的。
2020.12.10更新
让png和jpg都去死吧,用webp
以上仅作为个人的观点,如若有误,请指正!
“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png
智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。
我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真。
OK,在android平台下使用点九PNG技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果。
【普通拉伸和点九拉伸效果对比】
对比很明显,使用点九后,仍能保留图像的渐变质感,和圆角的精细度。
从中我们也可以理解为什么叫“点九PNG”,其实相当于把一张png图分成了9个部分(九宫格),分别为4个角,4条边,以及一个中间区域,4个角是不做拉升的,所以还能一直保持圆角的清晰状态,而2条水 平边和垂直边分别只做水平和垂直拉伸,所以不会出现边会被拉粗的情况,只有中间用黑线指定的区域做拉伸。结果是图片不会走样
二.“点九”的制作方法
方法1:使用 “draw9patch”工具绘制,流程如下
1. 安装工具
首先你需要给自己的电脑安装上java于系统的默认目录下。没有安装java的同学可以在百度搜索:jdk-6u20-windows-i586,安装包大小80M左右。
然后使用andriod模拟器—android-sdk-windows,打开SDK/tools目录下的“draw9patch.bat”文件,出现载入窗口:
2.导入并编辑
将png图片拖拽到该窗口中
如下图,自动进入编辑界面。图中介绍了每个区域的内容及功能注释。
预览右侧的视图发现,图片的边缘处于普通拉伸状态。
现在我们在图片边缘点击左键,绘制出黑线,即图片需要被拉伸的部分。如下图,对4条黑线做了注释。
如果失误多绘的部分,可按住shift键的同时点击鼠标左键擦除)。
如图所见,三种拉伸结果均已完美显示,已实现我们想要的拉伸效果,假设这是一个有显示文字的窗体,那么文字显示的区域,程序也会控制在黑线对应范围。
把PNG格式的文件解析成BYTE数组然后再组合成JPG
byte[]
b=null;
File
PNG
=
null;
BufferedOutputStream
stream
=
null;
try
{
PNG
=
new
File(outputFile);
FileOutputStream
fstream
=
new
FileOutputStream(PNG);
stream
=
new
BufferedOutputStream(fstream);
stream.write(b);
}
catch
(Exception
e)
{
//
log.error("helper:get
file
from
byte
process
error!");
e.printStackTrace();
}
finally
{
if
(stream
!=
null)
{
try
{
stream.close();
}
catch
(IOException
e)
{
//
log.error("helper:get
file
from
byte
process
error!");
e.printStackTrace();
}
}
}
Bitmap
bitmap=BitmapFactory.decodeByteArray(b,
0,
b.length);
擦..发现自己弄的是BMP格式..反正就这样差不多了..
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流