图片压缩

使用libjpeg进行图片压缩

空扰寡人 提交于 2020-04-07 21:26:25
简介 由于工作原因,boss下达的任务就大概说了对图片进行压缩寻找比较合理的方式,还举了一个项目中的坑,就是系统原生的Bitmap.compress设置质量参数为100生成图片会变大的坑。所以我打算用一点时间研究研究Bitmap在内存和外存中的情况。首先需要对图片进行压缩,大家都知道图片是Android里面一个大坑,具体的问题有: OOM,一不留神就用OOM来冲冲喜,所以网上就有了很多解决oom问题的建议,但是由于网友的水平不一也导致建议参差不齐。(内存) 图片压缩再加载失真严重,或者压缩率不够达不到项目要求的效果。(外存) 那我今天就要解决的就是通过今天查阅的资料和自己的判断,还有实践归档一下图片在Android上的问题。并且给出自己解决图片压缩问题的解决方案和实际操作。 1、为什么Android上的图片就不如IOS上的? libjpeg是广泛使用的开源JPEG图像库,安卓也依赖libjpeg来压缩图片。但是安卓并不是直接封装的libjpeg,而是基于了另一个叫Skia的开源项目来作为的图像处理引擎。Skia是谷歌自己维护着的一个大而全的引擎,各种图像处理功能均在其中予以实现,并且广泛的应用于谷歌自己和其它公司的产品中(如:Chrome、Firefox、 Android等)。Skia对libjpeg进行了良好的封装,基于这个引擎可以很方便为操作系统、浏览器等开发图像处理功能。

图片压缩和缩略图[JAVA]

早过忘川 提交于 2020-03-30 06:21:28
最近工作需要对服务器上面的文件进行压缩,并且把原来一些缩略图进行压缩。贴出代码片断供大家交流。 搜略图实现规定大小画布上缩小图片,方便列表显示。 图片压缩提供了2种方法。1、可以自定义压缩比。2、采用ImageIO进行默认压缩(更安全一些,不会出现内存溢出)。 private void doThumbCompress(File file) { BufferedImage bis = null ; BufferedImage bid = null ; try { int nw = 113 ; // 定义宽为113 int nh = 84 ; // 定义高为84 bis = ImageIO.read(file); int c_w = bis.getWidth(); int c_h = bis.getHeight(); if (c_w < 114 && file.length() < MIN_LENGTH) { bis = null ; return ; } if (c_w > WIDTH) { nw = WIDTH; nh = c_h * (WIDTH) / c_w; c_h = nh; c_w = nw; } if (c_h > HEIGHT) { nh = HEIGHT; nw = c_w * (HEIGHT) / c_h; } bid = new BufferedImage

Android APK瘦身方法小结

大城市里の小女人 提交于 2020-03-18 04:40:57
众所周知,APP包体的大小,会影响推广的难度,用户不太喜欢下载太大的APP,同类型同等功能的APP中往往是包体小的更受用户的青睐,所以降低包体是一项非常必要的事情,也是最近公司的APP需要降低包体,所以总结下自己知道的降低包体的方法。 一. 压缩图片 基本每个APP都需要用到相当多的图片,而这些图片在包体中了占据了不少的空间,特别是有些图片大小到达上百k的,加几张就吃不消,所以要对图片进行一定程度的压缩,这里推荐一个网站 --- TinyPng ,TinyPNG 是一个图片压缩网站,在上面压过的图基本都能小很多,而且压缩后的图片跟原图基本看不出区别,至少我的dog eye是看不出。使用很简单,把图片拖到网站上指定区域,或者点击按钮到自己存放图片的目录选择图片即可。 这里为了突显下压缩效果选了张非常大的图片,正常情况下是不可能把这么大的图片放在项目里的。可以看到压缩率高达82%,图片大小从4.5M降低到只有800kb。 二. 使用webp图片格式 具体可以看下 webp探寻之路 ,里面有对webp的详细介绍,这里简单说下webp其实是谷歌开发的一种新的图片格式,它跟PNG有点相似,最大优点在于压缩率高,支持有损和无损压缩,但是Android4.0及以上才支持webp格式,4.0以下想使用webp就需要其他辅助支持库了。 推荐一个在线转webp格式的 网址

swift--Photo相关用法(图片压缩,拍照取色)

给你一囗甜甜゛ 提交于 2020-03-05 10:25:19
本示例包含 - 调用系统相机 - 读取系统相册图片 - 图片压缩 - 提取图片中某一点的颜色 - 把图片保存到系统相册 注意: - 第一次运行会奔溃,根据日志中的提示在info.Plist文件中添加对应Key获取相关权限。 - 如果不压缩图片,选用相册中的高分辨率图片进行取色,在手指拖动时会有明显的卡顿 import UIKit import Photos class ViewController: UIViewController { let tagView = UIView() @IBOutlet weak var imageView: UIImageView! @IBAction func compressionClick(_ sender: Any) { if let image = imageView.image?.compression(size: CGSize(width: imageView.bounds.height, height: imageView.bounds.height)) { imageView.image = image } } @IBAction func saveImageClick(_ sender: Any) { if let image = imageView.image { UIImageWriteToSavedPhotosAlbum

C#图片压缩代码

半世苍凉 提交于 2020-03-01 22:36:08
下面的示例从 BMP 文件创建 Bitmap 对象。此代码将位图保存为 3 个 JPEG 文件,每个都有不同的质量级别。 [C#] 1 using System; 2 using System.Drawing; 3 using System.Drawing.Imaging; 4 class Example_SetJPEGQuality 5 { 6 public static void Main() 7 { 8 Bitmap myBitmap; 9 ImageCodecInfo myImageCodecInfo; 10 Encoder myEncoder; 11 EncoderParameter myEncoderParameter; 12 EncoderParameters myEncoderParameters; 13 // Create a Bitmap object based on a BMP file. 14 myBitmap = new Bitmap( " Shapes.bmp " ); 15 // Get an ImageCodecInfo object that represents the JPEG codec. 16 myImageCodecInfo = GetEncoderInfo( " image/jpeg " ); 17 // Create an

Android Bitmap压缩策略

Deadly 提交于 2020-02-28 03:38:40
一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有 小几十M,如16M,这导致加载 Bitmap 的时候很容易出现内存溢出。如下异常信 息,便是在开发中经常需要的: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略。其实核心思想很简单。假设 通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大, 这个时候把整个图片加载进来后再设置给 ImageView ,显然是没有必要的,因为 ImageView 根本没办法显示原始图片。这时候就可以按一定的采样率来将图片缩小 后再加载进来,这样图片既能在 ImageView 显示出来,又能降低内存占用从而在一 定程度上避免 OOM ,提高了 Bitmap 加载时的性能 二、Bitmap高效加载的具体方式 1.加载Bitmap的方式 Bitmap在Android中指的是一张图片。通过BitmapFactory类提供的四类方法: decodeFile , decodeResource , decodeStream 和 decodeByteArray ,分别从文件系统, 资源,输入流和字节数组中加载出一个Bitmap对象,其中

Android Bitmap压缩策略

时光总嘲笑我的痴心妄想 提交于 2020-02-27 23:18:29
一、为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有 小几十M,如16M,这导致加载 Bitmap 的时候很容易出现内存溢出。如下异常信 息,便是在开发中经常需要的: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略。其实核心思想很简单。假设 通过 ImageView 来显示图片,很多时候 ImageView 并没有原始图片的尺寸那么大, 这个时候把整个图片加载进来后再设置给 ImageView ,显然是没有必要的,因为 ImageView 根本没办法显示原始图片。这时候就可以按一定的采样率来将图片缩小 后再加载进来,这样图片既能在 ImageView 显示出来,又能降低内存占用从而在一 定程度上避免 OOM ,提高了 Bitmap 加载时的性能 二、Bitmap高效加载的具体方式 1.加载Bitmap的方式 Bitmap在Android中指的是一张图片。通过BitmapFactory类提供的四类方法: decodeFile , decodeResource , decodeStream 和 decodeByteArray ,分别从文件系统, 资源,输入流和字节数组中加载出一个Bitmap对象,其中

Android 高效加载大图片

╄→尐↘猪︶ㄣ 提交于 2020-02-16 21:29:30
我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。 我们可以通过下面的代码看出每个应用程序最高可用内存是多少。 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); 因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。 BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法

Android笔记--Bitmap

余生颓废 提交于 2020-02-09 03:26:16
Android | Bitmap解析 Android中Bitmap是对图像的一种抽象。通过他可以对相应的图像进行剪裁,旋转,压缩,缩放等操作。这里循序渐进的一步步了解Bitmap的相关内容。 先了解Bitmap相关的API,然后根据API进一步了解内部的实现。 1.生成Bitmap--BitmapFactory android.graphics.Bitmap.java /** * Private constructor that must received an already allocated native bitmap * int (pointer). */ // called from JNI Bitmap类中只有一个构造器。而且还不能直接调,必须通过JNI去构造 Bitmap(long nativeBitmap, byte[] buffer, int width, int height, int density, boolean isMutable, boolean requestPremultiplied, byte[] ninePatchChunk, NinePatch.InsetStruct ninePatchInsets) { ... } Bitmap类中只有一个构造器。而且还不能直接调,必须通过JNI去构造。源码中已经写的很清楚

图片压缩工具:grunt-contrib-imagemin

断了今生、忘了曾经 提交于 2020-02-04 11:40:10
  我们平时使用Photoshop 切出的图片,都含有一些不需要的信息或者多余的颜色值,这些信息和颜色值,对网页显示并没有用处,反而增加图片大小,Google Pagespeed 建议我们对于JPEG文件,使用jpegtran或jpegoptim(仅适用于Linux;使用--strip-all选项运行)。对于PNG文件,使用OptiPNG或PNGOUT。减小图片大小,就可以减少用户下载的文件大小,加快页面访问速度。   对于不同格式的图片,我们需要用pegtran/jpegoptim/OptiPNG/PNGOUT 的工具,这样对于前端开发费时费力,grunt-contrib-imagemin封装了这些压缩功能;大大方便了我们优化的工作.   安装 :npm install grunt-contrib-imagemin --save-dev   配置 :详细见https://github.com/gruntjs/grunt-contrib-imagemin   代码例子: module.exports = function (grunt) { 'use strict'; grunt.initConfig({ imagemin: { /* 压缩图片大小 */ dist: { options: { optimizationLevel: 3 //定义 PNG 图片优化水平 }, files