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 Doze模式启用和恢复详解

    Android Doze模式启用和恢复详解

    这篇文章主要介绍了Android Doze模式启用和恢复功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Android基于OpenCV实现霍夫直线检测

    Android基于OpenCV实现霍夫直线检测

    霍夫变换利用点与线之间的对偶性,将图像空间中直线上离散的像素点通过参数方程映射为霍夫空间中的曲线,并将霍夫空间中多条曲线的交点作为直线方程的参数映射为图像空间中的直线。给定直线的参数方程,可以利用霍夫变换来检测图像中的直线。本文简单讲解Android的实现
    2021-06-06
  • Android中的Notification机制深入理解

    Android中的Notification机制深入理解

    这篇文章主要给大家介绍了关于Android中Notification机制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Flutter Dio 简单封装demo

    Flutter Dio 简单封装demo

    这篇文章主要为大家介绍了Flutter Dio简单封装示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Android实现花瓣飘落效果的步骤

    Android实现花瓣飘落效果的步骤

    这篇文章主要介绍了Android实现花瓣飘落效果的步骤,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04
  • Android实现闪屏及注册和登录界面之间的切换效果

    Android实现闪屏及注册和登录界面之间的切换效果

    这篇文章主要介绍了Android实现闪屏及注册和登录界面之间的切换效果,实现思路是先分别实现闪屏、注册界面、登录界面的活动,再用Intent将相关的活动连接起来,实现不同活动之间的跳转,对android 实现闪屏和界面切换感兴趣的朋友一起看看吧
    2016-11-11
  • Android开发自学路线图

    Android开发自学路线图

    这篇文章主要介绍了Android开发自学路线图,本文讲解的路线图分为JAVA、Android基础、Web基础、Android项目4部份,是一个入门级学习路线图,需要的朋友可以参考下
    2015-04-04
  • android studio生成aar包并在其他工程引用aar包的方法

    android studio生成aar包并在其他工程引用aar包的方法

    本篇文章主要介绍了android studio生成aar包并在其他工程引用aar包的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 提升Android应用视觉吸引效果的10个UI设计技巧

    提升Android应用视觉吸引效果的10个UI设计技巧

    在Android应用开发中,风格和设计或许不是最关键的要素,但它们在决定Android应用成功与否上确实扮演重要的角色,以下是10个Android应用的UI设计技巧,还有个附加技巧,感兴趣的朋友可以了解下哦
    2013-01-01
  • Android通过startService播放背景音乐

    Android通过startService播放背景音乐

    这篇文章主要介绍了Android通过startService播放背景音乐简单示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12

最新评论