根據(jù)布局里scrollView的高度來截取圖片。
代碼如下:
1 /**
2 * 截取scrollview的屏幕
3 * @param scrollView
4 * @return
5 */
6 public static Bitmap getBitmapByView(ScrollView scrollView) {
7 int h = 0;
8 Bitmap bitmap = null;
9 // 獲取scrollview實際高度
10 for (int i = 0; i < scrollView.getChildCount(); i++) {
11 h += scrollView.getChildAt(i).getHeight();
12 scrollView.getChildAt(i).setBackgroundColor(
13 Color.parseColor("#ffffff"));
14 }
15 // 創(chuàng)建對應(yīng)大小的bitmap
16 bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
17 Bitmap.Config.RGB_565);
18 final Canvas canvas = new Canvas(bitmap);
19 scrollView.draw(canvas);
20 return bitmap;
21 }
22
23 /**
24 * 壓縮圖片
25 * @param image
26 * @return
27 */
28 public static Bitmap compressImage(Bitmap image) {
29 ByteArrayOutputStream baos = new ByteArrayOutputStream();
30 // 質(zhì)量壓縮方法,這里100表示不壓縮,把壓縮后的數(shù)據(jù)存放到baos中
31 image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
32 int options = 100;
33 // 循環(huán)判斷如果壓縮后圖片是否大于100kb,大于繼續(xù)壓縮
34 while (baos.toByteArray().length / 1024 > 100) {
35 // 重置baos
36 baos.reset();
37 // 這里壓縮options%,把壓縮后的數(shù)據(jù)存放到baos中
38 image.compress(Bitmap.CompressFormat.JPEG, options, baos);
39 // 每次都減少10
40 options -= 10;
41 }
42 // 把壓縮后的數(shù)據(jù)baos存放到ByteArrayInputStream中
43 ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
44 // 把ByteArrayInputStream數(shù)據(jù)生成圖片
45 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
46 return bitmap;
47 }
48
49 /**
50 * 保存到sdcard
51 * @param b
52 * @return
53 */
54 public static String savePic(Bitmap b) {
55 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss",
56 Locale.US);
57 File outfile = new File("/sdcard/image");
58 // 如果文件不存在,則創(chuàng)建一個新文件
59 if (!outfile.isDirectory()) {
60 try {
61 outfile.mkdir();
62 } catch (Exception e) {
63 e.printStackTrace();
64 }
65 }
66 String fname = outfile + "/" + sdf.format(new Date()) + ".png";
67 FileOutputStream fos = null;
68 try {
69 fos = new FileOutputStream(fname);
70 if (null != fos) {
71 b.compress(Bitmap.CompressFormat.PNG, 90, fos);
72 fos.flush();
73 fos.close();
74 }
75 } catch (FileNotFoundException e) {
76 e.printStackTrace();
77 } catch (IOException e) {
78 e.printStackTrace();
79 }
80 return fname;
81 }
在需要用到的地方調(diào)用getBitmapByView()方法即可。
但是這樣寫的話有時候會因為截取的圖片太長太大而報outofmemory的錯,所以為了避免內(nèi)存溢出,程序崩掉,要注意用Config.RGB_565,會比ARGB_8888少占內(nèi)存。還有就是把圖片壓縮一下,至少我這樣就沒有報oom的錯了,即:
1 String fname = ScreenShot.savePic(ScreenShot.compressImage(ScreenShot
2 .getBitmapByView(scrollView)));