概述:缩略图是对原图片进行压缩之后的结果
图片的压缩分种:1是比例压缩, 2是质量压缩
这两者压缩的区别见Android图片压缩(质量压缩和尺寸压缩)
下面介绍一下根据原图创建缩略图并保存到本地的方法,代码如下
originalUri是原图片的路径,thumbnaiUri是你将缩略图要保存的路径如sdcard/abc.jpg
public static void getThumbnail(String originalUri, String thumbnailUri) {
if (originalUri == null || originalUri.equals("")) {
return;
}
try {
BitmapFactory.Options options = new BitmapFactory.Options();
// 不返回实际的bitmap不给其分配内存空间而只包括一些解码边界信息即图片大小信息
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意,此时返回bitmap为空
Bitmap bitmap = BitmapFactory.decodeFile(originalUri, options);
// 重新设置为false,下一次返回实际的bitmap
options.inJustDecodeBounds = false;
// 计算缩放比
int widthRatio = (int) Math.ceil(options.outWidth / (float) 1200);
int heightRatio = (int) Math.ceil(options.outHeight / (float) 1600);
if (heightRatio > 1 || widthRatio > 1) {
if (heightRatio > widthRatio) {
options.inSampleSize = heightRatio;
} else {
options.inSampleSize = widthRatio;
}
} else {
options.inSampleSize = 1;
}
// 重新读入图片
bitmap = BitmapFactory.decodeFile(originalUri, options);
int degree = readPictureDegree(originalUri);
<span style="white-space:pre"> </span><span style="color:#ff6666;">//将缩略图选择到与原图同一个方向 </span>
bitmap = rotateBitmap(bitmap,degree) ;
// 保存缩略图
saveBitmap(bitmap, thumbnailUri);
} catch (OutOfMemoryError e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 保存bitmap
*
* @param bitmap
* @param uri
*/
public static void saveBitmap(Bitmap bitmap, String uri) {
File outFile = new File(uri);
try {
outFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream mFileOutputStream = null;
try {
mFileOutputStream = new FileOutputStream(outFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, mFileOutputStream);
try {
mFileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
mFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public 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;
}
public 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);
}