Android处理Bitmap使其能够不失真等比缩放裁剪后显示在ImageView上

Android开发过程中,我们有时需要动态得显示一些图片,并且这些图片的大小差距会十分大,如果需求并不是需要图片完整显示,但是需要不失真,并且要图片中间部分的情况下,我们需要做一系列处理,因为这个时候ImageView的各种scale type都不适用。具体步骤详见下面代码,大家也可以直接拷过去作为工具类使用

 1 /**
 2      * 获取正确缩放裁剪适应IamgeView的Bitmap
 3      * @param imageView
 4      * @param bitmap
 5      * @return
 6      */
 7     public static Bitmap createFitBitmap(ImageView imageView, Bitmap bitmap) {
 8         Log.i(TAG, "createFitBitmap<---------------------");
 9         int widthTarget = imageView.getWidth();
10         int heightTarget = imageView.getHeight();
11         int widthBitmap = bitmap.getWidth();
12         int heightBitmap = bitmap.getHeight();
13         Log.i(TAG, "widthTarget = " + widthTarget );
14         Log.i(TAG, "heightTarget = " + heightTarget );
15         Log.i(TAG, "widthBitmap = " + widthBitmap );
16         Log.i(TAG, "heightBitmap = " + heightBitmap );
17         Bitmap result = null;
18         if( widthBitmap >= widthTarget && heightBitmap >= heightTarget ){
19             result = createLargeToSmallBitmap(widthBitmap, heightBitmap, widthTarget, heightTarget, bitmap);
20         }
21         else if( widthBitmap >= widthTarget && heightBitmap < heightTarget ){
22             Bitmap temp = createLargeWidthToEqualHeightBitmap(widthBitmap, heightBitmap, widthTarget, heightTarget, bitmap);
23             result = createLargeToSmallBitmap(temp.getWidth(), temp.getHeight(), widthTarget, heightTarget, temp);
24         }
25         else if( widthBitmap < widthTarget && heightBitmap >= heightTarget ){
26             Bitmap temp = createLargeHeightToEqualWidthBitmap(widthBitmap, heightBitmap, widthTarget, heightTarget, bitmap);
27             result = createLargeToSmallBitmap(temp.getWidth(), temp.getHeight(), widthTarget, heightTarget, temp);
28         }
29         else{
30             Bitmap temp = createSmallToEqualBitmap(widthBitmap, heightBitmap, widthTarget, heightTarget, bitmap);
31             result = createFitBitmap(imageView, temp);
32         }
33         Log.i(TAG, "createFitBitmap--------------------->");
34         return result;
35     }
36     
37     
38     
39     private static Bitmap createLargeToSmallBitmap( int widthBitmap, int heightBitmap, int widthTarget, int heightTarget, Bitmap bitmap){
40         Log.i(TAG, "createLargeToSmallBitmap<---------------------");
41         Log.i(TAG, "widthTarget = " + widthTarget );
42         Log.i(TAG, "heightTarget = " + heightTarget );
43         Log.i(TAG, "widthBitmap = " + widthBitmap );
44         Log.i(TAG, "heightBitmap = " + heightBitmap );
45         int x = (widthBitmap - widthTarget) / 2;
46         int y = (heightBitmap - heightTarget) / 2;
47         Log.i(TAG, "createLargeToSmallBitmap--------------------->");
48         return Bitmap.createBitmap(bitmap, x, y, widthTarget, heightTarget);
49     }
50         
51     private static Bitmap createLargeWidthToEqualHeightBitmap(int widthBitmap, int heightBitmap, int widthTarget, int heightTarget, Bitmap bitmap){
52         
53         Log.i(TAG, "createLargeWidthToEqualHeightBitmap<---------------------");
54         Log.i(TAG, "widthTarget = " + widthTarget );
55         Log.i(TAG, "heightTarget = " + heightTarget );
56         Log.i(TAG, "widthBitmap = " + widthBitmap );
57         Log.i(TAG, "heightBitmap = " + heightBitmap );
58         double scale = ( heightTarget * 1.0 ) / heightBitmap;
59         Log.i(TAG, "createLargeWidthToEqualHeightBitmap--------------------->");
60         return Bitmap.createScaledBitmap(bitmap, (int)(widthBitmap * scale) , heightTarget, false);
61     }
62     
63     private static Bitmap createLargeHeightToEqualWidthBitmap(int widthBitmap, int heightBitmap, int widthTarget, int heightTarget, Bitmap bitmap){
64         
65         Log.i(TAG, "createLargeHeightToEqualWidthBitmap<---------------------");
66         Log.i(TAG, "widthTarget = " + widthTarget );
67         Log.i(TAG, "heightTarget = " + heightTarget );
68         Log.i(TAG, "widthBitmap = " + widthBitmap );
69         Log.i(TAG, "heightBitmap = " + heightBitmap );
70         double scale = ( widthTarget * 1.0 ) / widthBitmap;
71         Log.i(TAG, "createLargeHeightToEqualWidthBitmap--------------------->");
72         return Bitmap.createScaledBitmap(bitmap, widthTarget , (int)(heightTarget * scale), false);
73     }
74     
75     private static Bitmap createSmallToEqualBitmap(int widthBitmap, int heightBitmap, int widthTarget, int heightTarget, Bitmap bitmap){
76         
77         Log.i(TAG, "createSmallToEqualBitmap<---------------------");
78         Log.i(TAG, "widthTarget = " + widthTarget );
79         Log.i(TAG, "heightTarget = " + heightTarget );
80         Log.i(TAG, "widthBitmap = " + widthBitmap );
81         Log.i(TAG, "heightBitmap = " + heightBitmap );
82         double scaleWidth = ( widthTarget * 1.0 ) / widthBitmap;
83         double scaleHeight = ( heightTarget * 1.0 ) / heightBitmap;
84         double scale = Math.min(scaleWidth, scaleHeight);
85         Log.i(TAG, "createSmallToEqualBitmap--------------------->");
86         return Bitmap.createScaledBitmap(bitmap, (int)(widthBitmap * scale), (int)(heightBitmap * scale), false);
87     }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。