jpegandroid
Ⅰ 安卓手机支持什么格式的图片
vivo手机支持BMP、GIF、JPEG、PNG等格式的图片。
Ⅱ android如何获取相机分辨率
安卓系统在获取相机分辨率时,可以参考SDK中的API,获取相机的参数:
Camera.Parameters parameters = camera.getParameters();
获取预览的各种分辨率:
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
获取摄像头支持的各种分辨率:
List<Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
例如:获取照相机颤弯参数,设置需要的参数,其余缺省
Camera camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
设置照片格式:
parameters.setPictureFormat(PixelFormat.JPEG);
设置预浏尺嫌洞含寸,注意要在摄像头芹笑支持的范围内选择:
parameters.setPreviewSize(WIDTH, HEIGHT);
设置照片分辨率,注意要在摄像头支持的范围内选择
parameters.setPictureSize(WIDTH, HEIGHT);
设置照相机参数:
camera.setParameters(parameters);
开始拍照:
camera.startPreview();
以上就是获取相机分辨率的步骤。
Ⅲ 为Android应用添加背景应该使用什么样的图片格式,每个格式的的优势在哪
原创回答:《转载前请注明 from 网络知道-smile乌龟的回答》
先说结论;
1. 大的ViewGroup(Rl,FL ,LL,Cl等)布局背景应该设PNG
2. 小的view(Button,Recyclerview子item)的背景应该用WebP格式
3. 类似16*16的表情图 也应该用WebP,也可考虑PNG
在研究图片之前,首先搞明白三个问题:
像素点:计算机学科中,图片由一个一个像素点组成,像素点有两种ARGB和RGB,A,读作“alpha”,中文“透明度”的含义。
图片格式:JPEG 有损压缩
优点 :压缩过程中损失像素少(为什么要压缩?后文会说)
缺点:有损耗压缩会使原始图片数据质量下降(像素点变少了)
PNG无损压缩
优点:更优化的网络传输显示
(PNG图像在浏览器上采用流式浏览,即使经过交错处理的图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像)
支持透明效果
体积小适合网络传输,请求服务端的图片,节省流量
WebP 谷歌(google)开发的一种旨在加快图片加载速度的图片格式
优点:“在质量相同的情况下,WebP格式图像的体积要比JPEG格式图像小40%”
“WebP
的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha
透明以及动画的特性,在向JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一”
WebP应用比较优秀的:腾讯旗下 QQ空间客户端,QQ客户端,微信客户端等
WebP图片常用转换工具:智图,iSparta等
图片压缩:
以Android 为例,任何展示图片的View控件,加载图片的时候,都需要为图片申请内存,通常图片越大,申请的内存越大,Android系统限制了每个App的运行内存,一般为32MB-200M左右,为了优化App性能,必须对图片进行压缩:压缩图片尺寸
通过压缩图片尺寸,解决App运行时申请过多内存,被系统杀死的情况。
总结: JPEG是有损压缩,PNG是无损压缩,
当UI切了一张匹配实际手机屏幕大小的图片时 可以使用JPEG(不需要压缩图片)
当UI给的图片过大,需要程序员手动压缩时,考虑PNG
当UI给的图片过于离谱,不可理喻,导致APK包过大,用户反映耗费流量过多时,考虑使用WebP,而且WebP同PNG,JPEG是可以互转的
(PS:请求自服务端的图片资源,其实也是UI给的)
参考和补充:
图片格式,JPEG PNG WebP from网络
http://isux.tencent.com/introction-of-webp.html
http://www.cnblogs.com/xiangism/p/5311314.html
WebP图片常用转换工具:智图,iSparta 等
官方WebP解析库https://github.com/alexey-pelykh/webp-android-backport
Ⅳ android 图片质量压缩和尺寸压缩有什么区别
这个方法用来将特定格式的压缩图片写入输出流(OutputStream)中,当然例如输出流与文件联系在一起,压缩后的图片也就是一个文件。如果压缩成功则返回true,其中有三个参数:
format是压缩后的图片的格式,可取值:Bitmap.CompressFormat .JPEG、~.PNG、~.WEBP。
quality的取值范围为[0,100],值越小,经过压缩后图片失真越严重,当然图片文件也会越小。(PNG格式的图片会忽略这个值的设定)
stream指定压缩的图片输出的地方,比如某文件。
上述方法还有一个值得注意的地方是:当用BitmapFactory decode文件时可能返回一个跟原图片不同位深的图片,或者丢失了每个像素的透明值(alpha),比如说,JPEG格式的图片仅仅支持不透明的像素。文章android图片压缩在文末提到的下面这点可能就是这个原因:
当调用bitmap.compress(CompressFormat.JPEG, 100, fos);保存为图片时发现图片背景为黑色,如下图:
下面是质量压缩的代码:
(Bitmapbmp,Filefile){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
intoptions=80;//个人喜欢从80开始,
bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);
while(baos.toByteArray().length/1024>100){
baos.reset();
options-=10;
bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);
}
try{
FileOutputStreamfos=newFileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
}catch(Exceptione){
e.printStackTrace();
}
}
这段代码来自Android图片压缩总结,我根据自己的需求改了改,但是大同小异,所以就直接贴了。
随着代码中的option逐渐变小,我们可以在logcat中打印baos的大小来查看图片的大小。我们也可以去掉while的循环条件,一直压缩下去看效果,最终一张照片可能就由原来的3、4M变成了几百K甚至几百B了。我在试的过程中将option设置成100,压缩后偶尔会出现一张3、4M的图片经过压缩后竟变成了6、7M,这里还是有点困惑,不知道为什么。
随后,我想把这个压缩后的图片(1、200KB)填充到ImageView中时却失败了,logcat中提示图片过大!这就是文章开头提到的问题,虽然我们通过质量压缩使File形式的图片文件缩小了,但是并没有改变图片的宽高,原先是1080*1920分辨率的图片经压缩后还是1080*1920,而File格式转换成Bitmap格式进入到内存中时,内存是根据图片的像素数量来给图片分配内存大小的,还是有好几M,因此填充ImageView失败。
顺便提一下,可以用bitmap.getByteCount()获取存储bitmap像素的内存大小,但是KITKAT(Android 4.4版本)以后用getAllocateByteCount()获取。一般情况下,后者返回值比前者大,比如,当bitmap被重用去decode另外更小的bitmaps时,或者被人为地配置一下属性值,比如setWidth()、setHeight()、reconfigure()时,如果bitmap不做以上操作,二者的返回值应该是一样的。(译文,不太懂)
二、尺寸压缩
特点: 通过设置采样率, 减少图片的像素, 达到对内存中的Bitmap进行压缩
我们主要通过BitmapFactory中的decodeFile方法对图片进行尺寸压缩:
publicstaticBitmapdecodeFile(StringpathName,BitmapFactory.Optionsopts)
public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)
其中有两个参数:
pathName是图片文件的路径。
opts 就是所谓的采样率,它里边有很多属性可以设置,我们通过设置属性来达到根据自己的需要,压缩出指定的图片。其中比较常用的属性有:
booleaninJustDecodeBounds—— 如果设置为true,则只读取bitmap的宽高,而忽略内容。
intinSampleSize—— 如果>1,调用decodeFile方法后,就会得到一个更小的bitmap对象(已压缩)。比如设置为2,那么新Bitmap的宽高都会是原Bitmap宽高的1/2,总体大小自然就是原来的1/4了,以此类推。
booleaninPurgeable—— 如果设置为true,压缩后的图片像素占的内存将会在系统清理内存的时候被回收掉,当像素的信息再次被用到时将会自动重新decode该像素(比如getPixels()时)。(慎用!重复decode可以会造成UI的卡顿,API level 21 已弃用)
booleaninInputShareable—— 与inPurgeable配合使用,如果inPurgeable设置成false,自动忽略此值,如果inPurgeable为true,此值决定是否该bitmap能分享引用给输入数据(inputstream,array等),或者必须进行深拷贝。API level 21 已弃用。(这是译文,不太理解!!!)
下面是一段实现的代码
privateBitmapsizeCompres(Stringpath,intrqsW,intrqsH){
//用option设置返回的bitmap对象的一些属性参数
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;//设置仅读取Bitmap的宽高而不读取内容
BitmapFactory.decodeFile(path,options);//获取到图片的宽高,放在option里边
finalintheight=options.outHeight;//图片的高度放在option里的outHeight属性中
finalintwidth=options.outWidth;
intinSampleSize=1;
if(rqsW==0||rqsH==0){
options.inSampleSize=1;
}elseif(height>rqsH||width>rqsW){
finalintheightRatio=Math.round((float)height/(float)rqsH);
finalintwidthRatio=Math.round((float)width/(float)rqsW);
inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;
options.inSampleSize=inSampleSize;
}
returnBitmapFactory.decodeFile(path,options);//主要通过option里的inSampleSize对原图片进行按比例压缩
}
private Bitmap sizeCompres(String path, int rqsW, int rqsH) {
// 用option设置返回的bitmap对象的一些属性参数
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;// 设置仅读取Bitmap的宽高而不读取内容
BitmapFactory.decodeFile(path, options);// 获取到图片的宽高,放在option里边
final int height = options.outHeight;//图片的高度放在option里的outHeight属性中
final int width = options.outWidth;
int inSampleSize = 1;
if (rqsW == 0 || rqsH == 0) {
options.inSampleSize = 1;
} else if (height > rqsH || width > rqsW) {
final int heightRatio = Math.round((float) height / (float) rqsH);
final int widthRatio = Math.round((float) width / (float) rqsW);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
options.inSampleSize = inSampleSize;
}
return BitmapFactory.decodeFile(path, options);// 主要通过option里的inSampleSize对原图片进行按比例压缩
}
上面就是简单的质量压缩与尺寸压缩。