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     }
时间: 2024-10-07 18:32:48

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

android百度定位后显示在地图上点击弹出气泡

1.到百度地图页面申请key,注意key和项目包名和数字签名一一对应的.http://developer.baidu.com/map/index.php?title=%E9%A6%96%E9%A1%B5 2.下载相应的sdk包 :http://lbsyun.baidu.com/sdk/download 3. 创建项目,加入相应的包 在AndroidManifest中添加开发密钥.所需权限等信息: (1)在application中添加开发密钥 <application <meta-data an

[Android] 拍照、截图、保存并显示在ImageView控件中

最近在做Android的项目,其中部分涉及到图像处理的内容.这里先讲述如何调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法. PS:作者购买了本<Android第一行代码 著:郭霖>,参照里面的内容完成(推荐该书,前面的布局及应用非常不错).网上这类资料非常多,作者仅仅分享给初学者同时在线记录些内容,希望对大家有所帮助. 首先,设置activity_main.xml为LinearLayout布局且 android:orientation=&q

android真机上拍照后显示问题

最近在调用android系统拍照功能时,将拍出的照片在显示到ImageView上时,在模拟器上是正常的,可到了真机,死活显示不出来,后来经过多方查证终于调试好了. 1.要重载onConfigurationChanged事件,阻止调用相机后原本的Activity重新OnCreate,如果重新  OnCreate会导致ImageView上的照片被原本图片取代. 2.拍的照片长和宽和真机显示是相反的.同时照片必须经过压缩才好放到ImageView上. 3.如果调用相机时用了intent.putExtr

(转)关于android中bitmap过大导致的程序crash问题

第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle(); bitmap = null; } System.gc(); bitmap.recycle()方法用于回收该bitmap所占用的内存,接着将bitmap置空,最后,别忘了用System.gc()调用一下系统的垃圾回收器. 在这里要声明一下,bitmap可以有多个(以为着可以有多个i

android管理bitmap的内存

除了缓存bitmap之外,你还能做其他一些事情来优化GC和bitmap的复用.推荐的策略取决于Android的系统版本.附件中的例子会向你展示如何设计app以便在不同的Android版本中提高app的内存性能. 在不同的Android版本中,bitmap的内存管理有所不同. 在Android2.2(api level8)和之前的版本中,当GC触发的时候,App的主线程将会停止.这会导致一个明显的卡顿,并降低用户体验.从Android2.3开始加入了并发GC,这意味着只要bitmap不再被引用,内

Android Fragment 嵌套使用报错

在新的SDK每次创建activity时,会自动生成 <pre name="code" class="java">public static class PlaceholderFragment extends Fragment fragment模块,在该模块的基础上进行嵌套fragment代码如下: <pre name="code" class="java">public static class Pla

关于android 使用bitmap的OOM心得和解决方案

android开发,从2010年开始学习到现在的独立完成一个app,这漫长的四年,已经经历了很多次bug的折磨,无数次的加班训练.然而,自以为自己已经比较了解android了,却最近在一个项目上,因为oom而折腾了一个周,回到原地,认识了自己的不足,感觉自己是如此的菜鸟呀. 好了,不废话,大家在使用开发android的时候,很少会注意或者意识到释放内存的重要性,因为大家在使用过程中,涉及的图片资源不多,或者比较稳定,来回切换界面,图片也就那么几张或者使用的都是很小的图片,根本不会感觉到图片占用内

Android中Bitmap和Drawable

一.相关概念1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象2.Canvas画布,绘图的目的区域,用于绘图3.Bitmap位图,用于图的处理4.Matrix矩阵 二.Bitmap 1.从资源中获取Bitmap Java代码   Resources res = getResources(); Bitmap bmp = Bi

android中bitmap压缩的几种方法的解读

最近在研究微信的sdk,在缩略图这遇到了一点问题. 微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩.试了几种方法,一一道来. 1.质量压缩法: 代码如下 ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while ( baos.toByteArray().length /