`
u011467537
  • 浏览: 11145 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android compress图片压缩介绍

 
阅读更多

        android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片。
有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小。减少图片的大小有两种方法,1. 照小图片; 2. 压缩大图片。 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些; 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍就清晰)。下面组要是介绍图片的压缩:


1. 照相请查看http://www.jb51.net/article/37760.htm ->想要保存图片到制定目录,启动Camera应用时,需要指定文件
2. 压缩过程:
2.1 从图片路径中读取图片(图片很大,不能全部加在到内存中处理,要是全部加载到内存中会内存溢出)
[java]

复制代码 代码如下:

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 480, 800);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeFile(filePath, options);

 

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 480, 800);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeFile(filePath, options);

 


2.2 处理图片旋转
[java]

复制代码 代码如下:

int degree = readPictureDegree(filePath);
bm = rotateBitmap(bm,degree) ;

 

int degree = readPictureDegree(filePath);
bm = rotateBitmap(bm,degree) ;[java] view plaincopyprint?private static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}

private static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}

 


[java]

复制代码 代码如下:

view plaincopyprint?private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
if(bitmap == null)
return null ;

int w = bitmap.getWidth();
int h = bitmap.getHeight();

// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(rotate);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}

 

private static Bitmap rotateBitmap(Bitmap bitmap, int rotate){
if(bitmap == null)
return null ;

int w = bitmap.getWidth();
int h = bitmap.getHeight();

// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(rotate);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}

 


2.3压缩图片
[java]

复制代码 代码如下:

bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0

 

bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0

 


完整的方法代码:
[java]

复制代码 代码如下:

public static Bitmap getSmallBitmap(String filePath) {

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 480, 800);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeFile(filePath, options);
if(bm == null){
return null;
}
int degree = readPictureDegree(filePath);
bm = rotateBitmap(bm,degree) ;
ByteArrayOutputStream baos = null ;
try{
baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);

}finally{
try {
if(baos != null)
baos.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
return bm ;

}

 

public static Bitmap getSmallBitmap(String filePath) {

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 480, 800);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeFile(filePath, options);
if(bm == null){
return null;
}
int degree = readPictureDegree(filePath);
bm = rotateBitmap(bm,degree) ;
ByteArrayOutputStream baos = null ;
try{
baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);

}finally{
try {
if(baos != null)
baos.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
return bm ;

}


[java]

复制代码 代码如下:

view plaincopyprint?private static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

// Calculate ratios of height and width to requested height and
// width
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);

// Choose the smallest ratio as inSampleSize value, this will
// guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
}

return inSampleSize;
}

 

private static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

// Calculate ratios of height and width to requested height and
// width
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);

// Choose the smallest ratio as inSampleSize value, this will
// guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? widthRatio : heightRatio;
}

return inSampleSize;
}

分享到:
评论

相关推荐

    Android图片压缩解决方案,解决图片加载过程中ANR现象

    - `Bitmap.compress()`方法支持多种格式(如JPEG、PNG)的图片压缩,可以通过调整质量参数来控制文件大小。 3. **其他优化策略**: - 使用`BitmapRegionDecoder`类,只解码图片的一部分,适合处理大图。 - 利用...

    android 图片压缩 demo

    本教程将探讨如何在Android中实现图片的压缩,特别是在一个名为"picture-compress-m552-master"的项目中,该项目提供了高度自定义的图片压缩功能,能够将图片压缩至200h*200w的尺寸。 首先,我们要了解Android中...

    Android图片质量压缩

    Android提供了多种API来处理图片压缩,其中最常用的是`Bitmap`类及其相关方法。在Android中,图片通常先被加载为`Bitmap`对象,然后通过调整其质量和尺寸来实现压缩。 1. **BitmapFactory加载策略**: 使用`...

    Android 图片压缩Demo

    为了提高代码效率和性能,还可以考虑使用Android提供的`PurgeableBitmap`或第三方库如Glide、Picasso等,它们内置了图片压缩和缓存机制。此外,理解Android的内存管理机制和合理的图片加载策略也是优化图片处理的...

    Android图片压缩源代码

    在Android开发中,图片压缩是一项常见的需求,尤其是在处理用户拍照或从相册选取图片时,为了节省存储空间、提高应用性能以及减少网络传输的数据量,通常需要对图片进行压缩。本资源提供了一个基于Eclipse的Android...

    android开发图片压缩

    本教程将详细介绍如何在Android中实现图片压缩以及旋转相机拍摄图片的角度。 一、图片压缩 1. **选择压缩库**:在Android开发中,有许多优秀的开源库可以帮助我们进行图片压缩,如 Glide、Picasso 和 Fresco。这些...

    Android图片压缩结合多种压缩方式.zip

    在Android开发中,图片压缩是一项重要的技术,尤其对于优化应用性能和减少内存占用至关重要。本压缩包"Android图片压缩结合多种压缩方式.zip"提供了一种综合解决方案,它结合了尺寸压缩、质量压缩以及JNI(Java ...

    Android图片压缩示例

    5. **压缩算法**:在Android中,可以使用`Bitmap.compress()`方法实现图片压缩。该方法支持多种格式,如JPEG、PNG等,可以通过调整其第二个参数(质量值)来控制压缩程度,数值越小,质量越低,压缩比例越大。 6. *...

    android图片压缩的处理.zip

    在Android开发中,图片压缩是一项常见的任务,尤其在优化应用性能和减少内存占用时显得尤为重要。这个"android图片压缩的处理.zip"文件很可能是包含了一些示例代码或库,用于帮助开发者了解和实现Android平台上的...

    Android之图片压缩

    本文将详细讲解Android中的图片压缩技术,包括为什么要进行图片压缩、常用的图片压缩方法以及如何通过代码实现。 一、为什么需要图片压缩 1. 存储空间:大尺寸的图片会占用大量存储空间,影响应用的安装和更新速度...

    android经典图片压缩算法 永不失真

    在Android开发中,图片压缩是一项重要的技术,尤其在资源有限的移动设备上,处理大尺寸、高分辨率的图片时,可能会导致内存溢出或者应用运行缓慢。本篇将深入探讨"android经典图片压缩算法 - 永不失真"这一主题,...

    Android高效压缩图片不失真的方法总结

    在Android开发中,图片压缩是一项常见的任务,尤其在移动设备上,为了节省存储空间和提高应用性能,高效压缩图片而不失真是必要的。本篇文章将详细总结Android中实现这一目标的方法和策略。 首先,理解图片压缩的...

    Android压缩图片,图片质量不变

    在Android中,有两种主要的图片压缩方式:位图(Bitmap)操作和使用第三方库。 1. **位图(Bitmap)操作**: Android SDK提供了一些内置的API来处理Bitmap对象,可以用于压缩图片。我们可以使用`compress()`方法,...

    Android-Flora可能是Android平台上最快的图片压缩框架

    Android平台上的图片压缩是开发者们经常遇到的问题,尤其是在优化应用性能和减少数据传输时。"Android-Flora"被标榜为可能最快的图片压缩框架,它是在Luban(鲁班)的基础上进行优化和增强的。Luban是一款广泛使用的...

    图片压缩节约内存

    在Android开发中,我们可以使用多种方法实现图片压缩。例如,使用BitmapFactory的decode方法,配合Options对象的inSampleSize属性,可以设置图片解码时的缩放比例,从而降低图片的分辨率,达到压缩的目的。这种方法...

    安卓手绘图片处理画板相关-Android图片压缩尽量不失真100k左右.rar

    "Android图片压缩尽量不失真100k左右.rar"这个压缩包文件可能包含了实现这一目标的源代码示例。在安卓应用中,图片的压缩是一个关键环节,尤其是当需要保持图片质量的同时减小文件大小,以适应网络传输或存储空间的...

    Android中图片压缩方案详解

    在Android开发中,图片压缩是一项常见的任务,尤其在处理用户上传、显示大量图片或优化应用性能时显得尤为重要。本文将详细解析Android中的图片压缩方案,包括理论基础、常见方法及其实现步骤。 首先,理解图片压缩...

    Android图片压缩方法并压缩到指定大小

    本文将详细介绍两种主要的Android图片压缩方法:质量压缩和按比例大小压缩,并提供相应的代码实现。 **一、图片质量压缩** 质量压缩主要是通过调整图片的压缩率来降低图片的大小。在Android中,我们可以使用`...

    Android项目源码获取照片裁剪图片压缩图片工具库

    在Android开发中,图片处理是一项常见的任务,包括照片裁剪、图片压缩等操作。这个"Android项目源码获取照片裁剪图片压缩图片工具库"提供了一整套解决方案,旨在帮助开发者高效地处理图像,提高应用性能,同时节省...

    android图片无损压缩

    4. Android-Image-Compressor:专门为Android设计的图片压缩库,支持自定义压缩质量和尺寸,且能保持图片的原始格式。 三、手动实现图片压缩 1. 设置图片质量:使用Bitmap的compress方法,选择PNG或WEBP格式,因为...

Global site tag (gtag.js) - Google Analytics