-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathAndroid系统获取缩略图工具
215 lines (201 loc) · 6.11 KB
/
Android系统获取缩略图工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ThumbnailUtils;
/**
* Android系统获取缩略图工具
*
*/
public class ThumbnailUtil {
private final static String TAG = "ThumbnailUtil";
public ThumbnailUtil() {
super();
}
/**
* 根据指定的图像路径和大小来获取缩略图
* 此方法有两点好处:
* 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,
* 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。
* 2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使
* 用这个工具生成的图像不会被拉伸。
* @param imagePath 图像的路径
* @param width 指定输出图像的宽度
* @param height 指定输出图像的高度
* @return 生成的缩略图
*/
public static Bitmap getImageThumbnail(String imagePath, int width, int height) {
if(imagePath == null){
return null;
}
if(width <= 0){
width = 1;
}
if(height <= 0){
height = 1;
}
Bitmap bitmap = null;
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高,注意此处的bitmap为null
bitmap = BitmapFactory.decodeFile(imagePath, options);
options.inJustDecodeBounds = false; // 设为 false
// 计算缩放比
int h = options.outHeight;
int w = options.outWidth;
int beWidth = w / width;
int beHeight = h / height;
int be = 1;
if (beWidth < beHeight) {
be = beWidth;
} else {
be = beHeight;
}
if (be <= 0) {
be = 1;
}
options.inSampleSize = be;
// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
bitmap = BitmapFactory.decodeFile(imagePath, options);
// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
public static Bitmap getImageThumbnail(File imageFile, int width, int height) {
if(imageFile != null && imageFile.isFile()){
return getImageThumbnail(imageFile.getAbsolutePath(), width, height);
}
return null;
}
/**
* 获取视频的缩略图
* 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
* 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
* @param videoPath 视频的路径
* @param width 指定输出视频缩略图的宽度
* @param height 指定输出视频缩略图的高度度
* @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。
* 其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
* @return 指定大小的视频缩略图
*/
public static Bitmap getVideoThumbnail(String videoPath, int width, int height,
int kind) {
if(videoPath == null){
return null;
}
if(width <= 0){
width = 1;
}
if(height <= 0){
height = 1;
}
Bitmap bitmap = null;
// 获取视频的缩略图
bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
// 生成指定长宽的缩略图
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
return bitmap;
}
public static Bitmap getVideoThumbnail(File videoFile, int width, int height,
int kind) {
if(videoFile != null && videoFile.isFile()){
return getVideoThumbnail(videoFile.getAbsolutePath(), width, height, kind);
}
return null;
}
/**
* 拷贝文件
* @param is
* @param os
*/
public static void copyStream(InputStream is, OutputStream os) {
final int buffer_size = 1024;
try {
byte[] bytes = new byte[buffer_size];
for (;;) {
int count = is.read(bytes, 0, buffer_size);
if (count == -1)
break;
os.write(bytes, 0, count);
}
} catch (Exception ex) {
}
}
/**
* 拷贝文件
* @param src 源文件 eg: /mnt/sdcard/photo1.jpg
* @param dest 目标文件路径 eg: /mnt/sdcard/photo2.jpg
*/
public static void copyFile(String src, String dest) {
if(src == null || dest == null){
return;
}
try {
InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest);
copyStream(is, os);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 保存图片
* @param bitmap
* @param dest
*/
public static void saveImage(Bitmap bitmap, String dest) {
if (bitmap == null || dest == null) {
return;
}
try {
OutputStream os = new FileOutputStream(dest);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, os)) {
os.flush();
os.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据指定大小保存图片
* @param bitmap
* @param dest
* @param width
* @param height
*/
public static void saveImage(Bitmap bitmap, String dest, int width, int height) {
if (bitmap == null || dest == null) {
return;
}
if(width <= 0 || height <= 0){
return;
}
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
//缩放图片的尺寸
float scaleWidth = (float) width / bmpWidth; //按固定大小缩放 width 写多大就多大
float scaleHeight = (float) height / bmpHeight; //按固定大小缩放 height 写多大就多大
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
//产生缩放后的Bitmap对象
Bitmap resizeBitmap = Bitmap.createBitmap(
bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);
bitmap.recycle();
saveImage(resizeBitmap, dest);
}
}