Android 实现图片生成卷角和圆角缩略图的方法

 更新时间:2017年11月03日 11:04:17   作者:牧秦丶  
本篇文章主要介绍了Android 实现图片生成卷角和圆角缩略图的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在 Android 的一些界面中,有时候我们需要为一副图片生成大小为 n * n 的缩略图,有时候需要的缩略图特殊一些,比如:

1、带圆角的缩略图:

如果我们需要带圆角的缩略图,但提供的图片是 n * n 的正方形的图片,该怎么办?这时候可以在贴图之前,先利用 Paint.setXfermode 方法来设置图片叠加时的混合模式,从而达到目的。一般而言,使用方法如下:

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XXX);
canvas.drawBitmap(srcBmp, rc, rc, paint);

关于 PorterDuff.Mode 的值,确定了 SrcBmp 和 DstBmp 交叠时像素的处理方式,其作用用一幅图片展示如下:


我们看出 SrcIn 这个模式,只保留 SrcBmp 和 DstBmp 直接的交集部分,并且只展现 SrcBmp 上这部分交集的内容。这个模式适合我们做带圆角的缩略图。我们先在 Canvas 上绘制一个实心圆角矩形,其他部分透明,然后用这个模式把缩略图再绘制到 Canvas 上即可:

Bitmap roundThumbBitmap = Bitmap.createBitmap(
  rc.width(), rc.height(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(roundThumbBitmap);

Paint paint = new Paint();
paint.setColor(0xFFFF0000);  // 任何不透明的颜色均可。(作为掩码色)
paint.setAntiAlias(true);   // 开启抗锯齿,防止圆角毛躁.

// 填充一个圆角矩形.
final float radius = 5.0f;
canvas.drawRoundRect(new RectF(rc), radius, radius, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(srcBmp, rc, rc, paint);

做出的效果如下:


2、带 “卷角+圆角” 的缩略图:

有时候,我们需要为一张普通的图片生成 “卷角+圆角” 效果的图,像这样:


这时候,我们可以用两张辅助图来实现这个效果,一张底图做掩码,得到 “圆角+左上角切角” 的效果,然后用另一张图片覆盖在上面,得到 “灰色边框+右上角卷角” 的效果,我们需要的两张图如下:

代码如下:

Bitmap rollAngleThumbBmp = Bitmap.createBitmap(rc.width(), rc.height(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(rollAngleThumbBmp);

Bitmap maskBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.mask);
Bitmap borderBmp = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.border)).getBitmap();

Paint paint = new Paint();
paint.setAntiAlias(true);

// 先贴掩码图.
canvas.drawBitmap(maskBmp, rc, rc, paint);

// 再用 SrcIn 的模式贴缩略图.
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(srcBmp, rc, rc, paint);

// 先取消 Xfermode.
paint.setXfermode(null);

// 再贴边框卷角图.
canvas.drawBitmap(borderBmp, rc, rc, paint);

得到的效果如下(看起来有些毛躁,纯属是我切的 mask 和 border 图片的问题,不是方法的问题):

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android实现原生分享功能

    Android实现原生分享功能

    这篇文章主要介绍了Android实现原生分享功能,只能分享文字和图片,不能单独分享图片或者文字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android开发中的MVC设计模式浅析

    Android开发中的MVC设计模式浅析

    这篇文章主要介绍了Android开发中的MVC设计模式浅析,本文讲解了对Android开发中的MVC设计模式的理解,需要的朋友可以参考下
    2015-06-06
  • Android  onSaveInstanceState和onRestoreInstanceState触发的时机

    Android onSaveInstanceState和onRestoreInstanceState触发的时机

    这篇文章主要介绍了Android onSaveInstanceState和onRestoreInstanceState触发的时机的相关资料,需要的朋友可以参考下
    2017-05-05
  • android12 SD如何动态申请读写权限

    android12 SD如何动态申请读写权限

    这篇文章主要给大家介绍了关于android12 SD如何动态申请读写权限的相关资料,从Android 6.0开始,权限不再是在manifest⽂件中粘贴⼀下即可,这时候权限也正式⾛进⼤家的视野,需要的朋友可以参考下
    2023-07-07
  • Android 实用工具之emulator介绍

    Android 实用工具之emulator介绍

    Android 实用工具之emulator介绍,需要的朋友可以参考一下
    2013-02-02
  • Opengl ES之纹理贴图使用示例

    Opengl ES之纹理贴图使用示例

    这篇文章主要为大家介绍了Opengl ES之纹理贴图使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解Kotlin协程的异常处理机制

    详解Kotlin协程的异常处理机制

    协程会遇到各种异常情况,比如协程被取消、协程内部发生错误、协程之间的异常传播等,这些异常情况需要我们正确地处理,否则可能会导致程序崩溃、资源泄露或者逻辑错误,本文将介绍 Kotlin 协程的异常处理机制,需要的朋友可以参考下
    2023-09-09
  • Android实现手势滑动多点触摸缩放平移图片效果(二)

    Android实现手势滑动多点触摸缩放平移图片效果(二)

    这篇文章主要介绍了Android实现手势滑动多点触摸缩放平移图片效果,实现图片支持多点触控,自由的进行缩放、平移的注意事项,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Android 边播边缓存的实现(MP4 未加密m3u8)

    Android 边播边缓存的实现(MP4 未加密m3u8)

    这篇文章主要介绍了Android 边播边缓存的实现(MP4 未加密m3u8),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 快速掌握Android屏幕的知识点

    快速掌握Android屏幕的知识点

    相信不少设计师和工程师都被安卓设备纷繁的屏幕搞得晕头转向,我既做UI设计,也做过一点安卓界面布局,刚好对这块内容比较熟悉,所以在此我将此部分知识重新梳理出来分享给大家!有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11

最新评论