百科狗-知识改变命运!
--

压缩文件这三种格式有什么区别?我要压缩相片和视频,用哪个?

泡在奶味里1年前 (2023-12-21)阅读数 7#综合百科
文章标签格式像素

RAR格式和ZIP格式都可压缩相片和视频,RAR

格式

ZIP格式压缩后的文件大小不同,并且在压缩的速率不同(也就是压缩时候的速度)。但是具体哪个好,一般用RAR。你可分别压缩同一个文件,用这些方式,去对比下压缩后的文件大小。总之相片和视频都可用这些格式压缩。

这个方法用来将特定格式的压缩写入输出流(OutputStream)中,当然例如输出流与文件联系在一起,压缩后的也就是一个文件。如果压缩成功则返回true,其中有三个参数:

format是压缩后的的格式,可取值:Bitmap.CompressFormat .JPEG、~.PNG、~.WEBP。

quality的取值范围为[0,100],值越小,经过压缩后失真越严重,当然文件也会越小。(PNG格式的会忽略这个值的设定)

stream指定压缩的输出的地方,比如某文件。

上述方法还有一个值得注意的地方是:当用BitmapFactory decode文件时可能返回一个跟原不同位深的,或者丢失了每个像素的透明值(alpha),比如说,JPEG格式的仅仅支持不透明的像素。文章android压缩在文末提到的下面这点可能就是这个原因:

当调用bitmap.compress(CompressFormat.JPEG, 100, fos);保存为时发现背景为黑色,如下图:

这时只需要改成用png保存就可以了,bitmap.compress(CompressFormat.PNG, 100, fos);,如下图:

下面是质量压缩的代码:

public?static?void?compressBmpToFile(Bitmap?bmp,File?file){?

ByteArrayOutputStream?baos?=?new?ByteArrayOutputStream();?

int?options?=?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?{?

FileOutputStream?fos?=?new?FileOutputStream(file);?

fos.write(baos.toByteArray());?

fos.flush();?

fos.close();?

}?catch?(Exception?e)?{?

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方法对进行尺寸压缩:

public?static?Bitmap?decodeFile?(String?pathName,?BitmapFactory.Options?opts)?

public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)

其中有两个参数:

pathName是文件的路径。

opts 就是所谓的采样率,它里边有很多属性可以设置,我们通过设置属性来达到根据自己的需要,压缩出指定的。其中比较常用的属性有:

boolean?inJustDecodeBounds?—— 如果设置为true,则只读取bitmap的宽高,而忽略内容。

int?inSampleSize—— 如果>1,调用decodeFile方法后,就会得到一个更小的bitmap对象(已压缩)。比如设置为2,那么新Bitmap的宽高都会是原Bitmap宽高的1/2,总体大小自然就是原来的1/4了,以此类推。

boolean?inPurgeable—— 如果设置为true,压缩后的像素占的内存将会在系统清理内存的时候被回收掉,当像素的信息再次被用到时将会自动重新decode该像素(比如getPixels()时)。(慎用!重复decode可以会造成UI的卡顿,API level 21 已弃用)

boolean?inInputShareable—— 与inPurgeable配合使用,如果inPurgeable设置成false,自动忽略此值,如果inPurgeable为true,此值决定是否该bitmap能分享引用给输入数据(inputstream,array等),或者必须进行深拷贝。API level 21 已弃用。(这是译文,不太理解!!!)

下面是一段实现的代码

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?

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)