Glide的图像适配Imageview提供了两种写好的模式centerCrop,fitCenter。
在看代码时出现了一些疑惑,就是TransformationUtils这个类中的centerCrop方法,看代码

public static Bitmap centerCrop(Bitmap recycled, Bitmap toCrop, int width, int height) {if (toCrop == null) {return null;} else if (toCrop.getWidth() == width && toCrop.getHeight() == height) {return toCrop;}// From ImageView/Bitmap.createScaledBitmap.final float scale;float dx = 0, dy = 0;Matrix m = new Matrix();if (toCrop.getWidth() * height > width * toCrop.getHeight()) {scale = (float) height / (float) toCrop.getHeight();dx = (width - toCrop.getWidth() * scale) * 0.5f;} else {scale = (float) width / (float) toCrop.getWidth();dy = (height - toCrop.getHeight() * scale) * 0.5f;}m.setScale(scale, scale);m.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));final Bitmap result;if (recycled != null) {result = recycled;} else {result = Bitmap.createBitmap(width, height, getSafeConfig(toCrop));}// We don't add or remove alpha, so keep the alpha setting of the Bitmap we were given.TransformationUtils.setAlpha(toCrop, result);Canvas canvas = new Canvas(result);//大小就是width*heightPaint paint = new Paint(PAINT_FLAGS);canvas.drawBitmap(toCrop, m, paint);return result;}

这个方法就是将bitmap裁剪成一个指定大小的bitmap。这个方法里面的解析网上有了,整体看下来好像也没什么问题,就是在计算缩放值的时候,有点不懂了

  if (toCrop.getWidth() * height > width * toCrop.getHeight()) { //为什么这个判断条件下是用高去做缩放scale = (float) height / (float) toCrop.getHeight();dx = (width - toCrop.getWidth() * scale) * 0.5f;} else {scale = (float) width / (float) toCrop.getWidth();dy = (height - toCrop.getHeight() * scale) * 0.5f;}

在toCrop.getWidth() * height > width * toCrop.getHeight()这个条件下为什么是用高计算缩放值。
这里我们简化下,我们拿到的需要裁剪的一张图大小的宽为tW,高为tH,需要适配的图像宽高是W,H。
那么上面的公式就变成tW *H > W * tH。在这个条件下用高缩放,想了好久没明白,不知所云。
这样写肯定是有理由的,找了好久终于找到答案了,就是这么一段话

关于长短边:“长边”是指原尺寸与目标尺寸的比值大的那条边,“短边”同理。例如,原图400x200,缩放为 800x100,由于 400/800=0.5,200/100=2,0.5 < 2,所以在这个缩放中 200 那条是长边,400 那条是短边。

就是图像处理的长短边问题,上面用的就是短边去适配,所以上面的公式转换下就是tW / W > tH/H,看到这里再结合长短边的概念就明白了,这里需要注意的是短边是打了引号的,并不是长度的短,而是在比值中的“短”。

弄明白这个条件的意思,问题又来了,为什么用短边去计算缩放大小,

是因为用短边去适配的缩放值肯定要小于长边的缩放值,这样能保证,要裁剪的图片的短边跟目标图的边大小一样,而长边的缩放之后不会小于目标边的长度。

举个例子,要裁剪的图大小18 * 8,目标图的大小6 * 4 ,(18/6 =3 ) > (8/4 = 2),这个时候应该用短边8去适配,也就是8缩小成4,长边18页就变成9,也就变成了一个9 * 4的图像然后这样按centerCrop去裁剪成6 * 4就不会留白了。画个图就明白了

上图的1.5就是centerCrop方法里面的dx表示平移的偏移量,也就是

    dx = (width - toCrop.getWidth() * scale) * 0.5f;

最后调用 canvas.drawBitmap(toCrop, m, paint);就能画出一个裁剪后的的目标图了,整个方法就做了两件事,先缩放原图,然后裁剪绘制,这里也不是真正的裁剪,只是在绘制的时候先偏移了一定的长度,导致绘制的区域超出了,我们只能看见在目标区bitmap内的图像,类似裁剪的意思。
这里主要是要意识到图片处理的长短边适配的概念。随便了解下centCrop的过程及原理。
写完之后才发觉时间飞逝~,一天又没了

Glide的图像centerCrop处理-长短边适配相关推荐

  1. Glide centerCrop fitCenter和ImageView的scaleType的关系,互相影响的探讨

    转载请注明出处,谢谢http://blog.csdn.net/harryweasley/article/details/71526216 在使用Glide的过程中,你一定见过下面的代码方式: Imag ...

  2. Glide 入门到精通之四——图片缩放和调整大小

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50961330 文章出自:薛瑄的博客 图片调整大小和缩放是有趣的,在实际应用中也是很 ...

  3. 新一代图像AI ISP技术

    新一代图像AI ISP技术 2021年12月29日消息,近日,华为海思发布了新一代的越影AI ISP,这是用于物联网智能终端的新一代智能图像处理引擎,突破传统 ISP 图像处理的极限,将业界画质标杆推 ...

  4. glide_在Android中将数据绑定与Glide结合使用

    glide 在这篇有关数据绑定的文章中,我们将研究如何在imageview中使用带有glide的数据绑定来加载图像. 首先,我要说您不需要自定义图像视图. 使用绑定适配器声明自定义属性,我们可以轻松地 ...

  5. 【原创】多dpi适配的新姿势

    多dpi适配的新姿势 1. 简介 Android中经常要通过ImageView进行图片资源显示.在加载图片时,首先要考虑的两个因素就是体验问题和性能问题. 其中,体验问题是指图片显示的是否正确(例如U ...

  6. android listview 上拉图片闪烁,android listview使用glide异步加载图片错位,闪烁问题...

    参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...

  7. ISP-长短曝光融合生成HDR图像

    1.高动态范围图像相关 图像的动态范围是指一幅图像中量化的最大亮度与最小噪声的比值.高动态范围HDR(high dynamic range)图像,能够完整表示真实场景中跨度很大的动态范围.采用普通CM ...

  8. Android中的适配

    文字适配 1.根据应用需要适配的国家语音建立多个values文件 2.在各个values文件下建立strings资源 3.默认情况下取得是values低下的strings 4.应用会根据手机设置的语音 ...

  9. 医学领域图像相关自述

    一.研究方向.规划:医学图像算法 医学图像主要分为以下几类: X射线成像(用X射线穿透密度.厚度不同的人体组织形成黑白影像) X射线断层扫描CT(X射线旋转扫描人体,再用电脑的三维重建技术构造断层影像 ...

  10. android listview使用glide异步加载图片错位,闪烁问题

    参考网上方法:https://www.jianshu.com/p/f5593b87ee07 // 获取图像控件的Tag String tag = (String) holder.imgView.get ...

最新文章

  1. 什么是StackOverflowError?
  2. nodejs安装node-rsa遇到的问题及解决
  3. Oracle技术之OCRCONFIG工具
  4. 你可以不知道原因,但是,我们不能停止努力。httplook抓取路由配置界面信息...
  5. [Python人工智能] 二十六.基于BiLSTM-CRF的医学命名实体识别研究(上)数据预处理
  6. java8 快排_Java 8快多少?
  7. python帮助文档在哪_python文档在哪里
  8. 如何做一个内心强大的人
  9. 高可用之KeepAlived(一):基本概念和配置文件分析
  10. 一个适用于visual studio 2005的一个js日历控件--zhuan
  11. c语言 自适应模式算术编码,算术压缩论文基于算术编码的数据压缩算法研究与实现.doc...
  12. linux dns权重设置,权重及权重配置
  13. 【最强实习生】20场Android面试斩获大厂offer,来看看我都会些什么
  14. 网络编辑必学:网络新闻标题之争
  15. DACAI串口屏使用
  16. python 使用sk_learn :ValueError: Expected 2D array, got 1D array instead
  17. Bluehost注册流程与问题
  18. 【C语言】机试100题及代码答案(上)
  19. Facade(外观)
  20. 关于Caused by: com.alibaba.fastjson.JSONException: syntax error, expect }, actual ,

热门文章

  1. 公安“智慧型”监所解决方案
  2. plc输入/输出模块的选择
  3. 算法设计与分析基础 第四章谜题
  4. 简单易学的机器学习算法——极限学习机(ELM)
  5. Python UI自动化报错汇总2
  6. 免费下载qq音乐的音频资源的方法
  7. 路由器(Tenda 811R)变砖——修复
  8. 大学计算机与应用软件,深圳大学
  9. 2012浙江大学光华法学院毕业典礼教师发言之高艳东
  10. 简单了解TransE