博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android图像处理-像素化的原理及实现
阅读量:2440 次
发布时间:2019-05-10

本文共 2151 字,大约阅读时间需要 7 分钟。

原文地址:

博客地址: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); //对指定区域打马赛克

开源项目

是实现基本马赛克效果的开源项目,它能够异步对整个或者部分的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();

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

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

效果如下:

转载地址:http://xpfqb.baihongyu.com/

你可能感兴趣的文章
c语言检查字符函数_如何在C中检查字符值
查看>>
如何在JavaScript中删除字符串的第一个字符
查看>>
rcp扩展文本编辑器_我如何使用文本扩展来节省时间
查看>>
c语言中的i/o_C语言中的基本I / O概念
查看>>
c语言 函数 返回 字符串_如何从C函数返回字符串
查看>>
react 表单自动提交_我如何解决React登录表单状态和浏览器自动填充的问题
查看>>
macbook 黑暗模式_在黑暗模式下更改图标
查看>>
未定义符号错误_包裹,如何修复“ regeneratorRuntime未定义”错误
查看>>
JavaScript中的null和undefined有什么区别?
查看>>
safari无法退出_Safari,退出前警告
查看>>
如何使用Mac连接到Raspberry Pi
查看>>
web项目打包到上线教程_如何从教程转到自己的项目
查看>>
如何将文本写入HTML画布
查看>>
如何修复TypeError:无法分配为只读对象'#的属性'exports' 错误
查看>>
c++全局变量_C全局变量
查看>>
如何在脚本模块外部的Sapper中访问URL参数
查看>>
sql横着连接起来sql_SQL联接
查看>>
如何在Netlify函数中访问查询参数
查看>>
c++ 函数中嵌套函数_可以在C中嵌套函数吗?
查看>>
如何从JavaScript数组中删除重复项
查看>>