Android图像处理-像素化的原理及实现

作者:夏正冬

原文地址:Android图像处理-像素化的原理及实现

博客地址:xiazdong.github.io

马赛克算法首先需要确定马赛克单元的大小,即小方块的大小。马赛克图的每个马赛克单元都是纯色的块,其取值一般为原图中该块区域的颜色的均值(这里的实现为了简化,取了原图中该区域左上角的像素)。马赛克单元的大小决定了最后的马赛克图的样子,当值为1时,就是原图。

上图中,最左边的图是原图,中间的图是马赛克图。当然你也可以对图像的某块区域打马赛克,如最右边的图,他只对头部打马赛克。

算法实现如下:

public class PixelateUtil {
    /
      普通图像->像素图,zoneWidth为像素图的大像素的宽度
     /
    public static Bitmap pixelate(Bitmap bitmap, int zoneWidth) {
        return pixelate(bitmap, zoneWidth, 0, 0, bitmap.getWidth(), bitmap.getHeight());
    }

    /
      普通图->像素图,left、top、right、bottom可指定打马赛克区域
     /
    public static Bitmap pixelate(Bitmap bitmap, int zoneWidth, int left, int top, int right, int bottom) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Bitmap result = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        for (int i = left; i < right; i += zoneWidth) {
            for (int j = top; j < bottom; j += zoneWidth) {
                int color = bitmap.getPixel(i, j);
                paint.setColor(color);
                int gridRight = Math.min(w, i + zoneWidth);
                int gridBottom = Math.min(h, j + zoneWidth);
                canvas.drawRect(i, j, gridRight, gridBottom, paint);
            }
        }
        return result;
    }
}

使用方法:

Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth);  //对全图打马赛克
Bitmap result = PixelateUtil.pixelate(bitmap, zoneWidth, left, top, right, bottom); //对指定区域打马赛克

开源项目

Pixelate是实现基本马赛克效果的开源项目,它能够异步对整个或者部分的Bitmap区域打马赛克,处理完后会在OnPixelateListener的onPixelated()中回调,最小的SDK版本为16。

使用方法如下:

new Pixelate(origin)
    .setArea(0,0,origin.getWidth(),origin.getHeight())  //设置区域
    .setDensity(12) //值越大,马赛克单元越小
    .setListener(new OnPixelateListener() {
        @Override
        public void onPixelated(Bitmap bitmap, int density) {
            //bitmap为马赛克图
            Log.v(TAG, "");
        }
    })
    .make();

android-close-pixelate能够实现多样式的马赛克效果。使用方法如下:

Bitmap pixelated = Pixelate.fromBitmap(
        origin,
        new PixelateLayer.Builder(PixelateLayer.Shape.Circle) //设置马赛克形状
                .setResolution(30) //每个像素的密度(如果该值和size值一样,那么圆形之间相邻)
                .setSize(30) //圆圈的大小
                .build()
);

效果如下:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我就是马云飞

自定义角标库

前言 角标的需求在app是经常需要用到的,比如未读通知/信息等,一般,我们可以通过嵌套相对布局的方式来设置角标,但是除了TextView,可能Butt...

2147
来自专栏糊一笑

深入常用CSS声明(一) —— Background

一直对一些自己常用的css声明掌握得不是很全,只知道常用的一些属性和值,但是对于其他的用法确实一知半解,这篇文章旨在扫盲,先不说有多深的理解,至少做到能够看到这...

3395
来自专栏一“技”之长

Android开发之LinearLayout布局详解

        LinaerLayout又被称为线性布局,是Android界面开发中常用的一种容器视图控件。可以使用XML布局文件配置和代码动态创建两种方式来使...

793
来自专栏CodingBlock

Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas...

36912
来自专栏指尖下的Android

安卓运动圆环自定义View

记得这个东西原来有个同事问过我,当时正在自学自定义View和属性动画这一块,对这个功能也没有写过,所以就google了一下,发了几个类似效果的github项目给...

1472
来自专栏進无尽的文章

绘图-圆环进度条实现详解

1332
来自专栏前端知识分享

第97天:CSS3渐变和过渡详解

渐变是CSS3当中比较丰富多彩的一个特性,通过渐变我们可以实现许多炫丽的效果,有效的减少图片的使用数量,并且具有很强的适应性和可扩展性。

843
来自专栏Android开发指南

裁剪圆形图片原理

2565
来自专栏GIS讲堂

Arcgis for JavaSctipt之常用Layer详解

概述:Arcgis for Javasctipt中常见的layer有动态图层(ArcGISDynamicMapServiceLayer

1165
来自专栏HTML5学堂

“鼠标移入显示悬浮框”特效,也可以“高大上”

HTML5学堂(码匠):网站中最为常见的一种特效——鼠标移入元素,出现介绍信息的悬浮框,要么是淡入,要么是单方向的滑入,总觉得太单一了有木有?其实,稍微调整一下...

3949

扫码关注云+社区