并没有像其他例子一样对局部打马赛克,这个算法是对整张图片打马赛克.

    /*** @description 图片打马赛克** @param bitmap*            需要打马赛克的图片* @param BLOCK_SIZE*            马赛克方块*/public static Bitmap BitmapMosaic(Bitmap bitmap, int BLOCK_SIZE) {if (bitmap == null || bitmap.getWidth() == 0 || bitmap.getHeight() == 0|| bitmap.isRecycled()) {return null;}int mBitmapWidth = bitmap.getWidth();int mBitmapHeight = bitmap.getHeight();Bitmap mBitmap = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight,Config.ARGB_8888);//创建画布int row = mBitmapWidth / BLOCK_SIZE;// 获得列的切线int col = mBitmapHeight / BLOCK_SIZE;// 获得行的切线int[] block = new int[BLOCK_SIZE * BLOCK_SIZE];for (int i = 0; i <=row; i++){for (int j =0; j <= col; j++){int length = block.length;int flag = 0;// 是否到边界标志if (i == row && j != col) {length = (mBitmapWidth - i * BLOCK_SIZE) * BLOCK_SIZE;if (length == 0) {break;// 边界外已经没有像素}bitmap.getPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, mBitmapWidth - i * BLOCK_SIZE,BLOCK_SIZE);flag = 1;} else if (i != row && j == col) {length = (mBitmapHeight - j * BLOCK_SIZE) * BLOCK_SIZE;if (length == 0) {break;// 边界外已经没有像素}bitmap.getPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, BLOCK_SIZE, mBitmapHeight - j* BLOCK_SIZE);flag = 2;} else if (i == row && j == col) {length = (mBitmapWidth - i * BLOCK_SIZE)* (mBitmapHeight - j * BLOCK_SIZE);if (length == 0) {break;// 边界外已经没有像素}bitmap.getPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, mBitmapWidth - i * BLOCK_SIZE,mBitmapHeight - j * BLOCK_SIZE);flag = 3;} else{bitmap.getPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);//取出像素数组}int r = 0, g = 0, b = 0, a = 0;for (int k = 0; k < length; k++) {r += Color.red(block[k]);g += Color.green(block[k]);b += Color.blue(block[k]);a += Color.alpha(block[k]);}int color = Color.argb(a / length, r / length, g / length, b/ length);//求块内所有颜色的平均值for (int k = 0; k < length; k++) {block[k] = color;}if (flag == 1) {mBitmap.setPixels(block, 0, mBitmapWidth - i * BLOCK_SIZE,i * BLOCK_SIZE, j* BLOCK_SIZE, mBitmapWidth - i * BLOCK_SIZE,BLOCK_SIZE);} else if (flag == 2) {mBitmap.setPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, BLOCK_SIZE, mBitmapHeight - j* BLOCK_SIZE);} else if (flag == 3) {mBitmap.setPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, mBitmapWidth - i * BLOCK_SIZE,mBitmapHeight - j * BLOCK_SIZE);} else {mBitmap.setPixels(block, 0, BLOCK_SIZE, i * BLOCK_SIZE, j* BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);}}}//并没有回收传进来的bitmap  原因是JAVA传值默认是引用,如果回收了之后,其他地方用到bitmap的位置可能报NULL指针异常,请根据实际情况决定是否回收.return mBitmap;}

算法很简单,对区域内的所有像素点求平均颜色 然后覆盖到原来的板块上.

Android 对整张图片打马赛克相关推荐

  1. Java中的实现马赛克效果以及灰度效果----整张图片

    ** Java中的实现马赛克效果以及灰度效果-----整张图片 ** 实现该效果的思路: 我们知道图片是由一个一个的像素组成的,比如一张图片的分辨率为800 * 800,则它是由800个像素 * 80 ...

  2. 代码实现识别部分截图在整张图片中的位置_基于神经网络的OCR识别

    基于神经网络的OCR识别 Optical Character Recognition(OCR) 光学识别,通俗的讲就是识别图片内的文字,比如身份证上的身份证号,姓名,地址等,银行卡上的卡号 等等. E ...

  3. Android中一张图片占用的内存大小

    最近面试过程中发现对Android中一些知识有些模棱两可,之前总是看别人的总结,自己没去实践过,这两天对个别问题进行专门研究 探讨:如何计算Android中一张图片占据内存的大小 解释:此处说的占据内 ...

  4. java读图片显示到前端_java从前端获取参数添加到图片后返回整张图片

    java从前端获取参数添加到图片后返回整张图片 以后为整个servlet代码,请自行加入到j2ee工程. import java.awt.Color; import java.awt.Font; im ...

  5. 第7章第20节:单图排版:使用巨型字母分隔整张图片 [PowerPoint精美幻灯片实战教程]

    本节演示另一种非常具有创意的单图排版方式,就是使用一个巨型的字母,来分隔整张图片.首先来绘制一个矩形. 在此处按下并向右下方拖动,以绘制一个和图片相同尺寸的矩形. 在常用形状区域,选择此处的文本框. ...

  6. python通过获取图片固定位置的颜色坐标,并且通过坐标点颜色填充整张图片代码+注释

    先上代码: #!/usr/bin/env python # -*- coding:utf-8 -*- import cv2 import os import numpy as np import uu ...

  7. Android加载本地大Bitmap文件,解析出来的Bitmap是整张图片是黑色的

    问题现象 缓存宽高很大的Bitmap在本地,将这个Bitmap拉到电脑中,后缀改成.png或者.jpg,使用图片浏览器显示正常.然而,使用Android Bitmap解析库解析成Bitmap,用Can ...

  8. Python学习笔记_多张图片生成马赛克图

    原文链接:使用Python简单实现马赛克拼图 代码如下: import os import time from functools import reduce from threading impor ...

  9. Android 添加多张图片。

    先看效果图. 直接上代码.主要是Adapter这边. public class GvAdapter extends BaseAdapter{private Context context;privat ...

最新文章

  1. 更轻量的 View Controllers
  2. SPOJ375(树链剖分)
  3. 手机端实现点击复制功能
  4. Xcode 不用签名编译程序
  5. 控制台编写JAVA程序教程_写一个java程序的步骤是什么?写java程序技巧
  6. java学习(51):上转型对象
  7. java mvel_mvel java和脚本的融合 -- kkito的博客
  8. Linux vsyscall和vDSO加速系统调用
  9. WebSocket 实现原理
  10. Spring @Value转义冒号(:)的默认值
  11. dstwo linux 模拟器,dstwo md模拟器使用图文教程
  12. 极化码理论及算法研究5-SC算法及matlab仿真
  13. 五一快乐假期每天都在上课qaq
  14. 流水号(自动编号)生成相关问题(并发、事务)及解决方案
  15. 六 详细讲解主进程和渲染进程
  16. 苹果授权登录,后端校验(Sign in with Apple)
  17. P5304旅行者(比bk201还要流氓的解法)
  18. 微分中值定理及其应用——(不定式极限洛必达法则)
  19. 拿到软考证书到底会有哪些作用?
  20. QT - 创建UDP Socket通信

热门文章

  1. KOOCAN教你如何用一句话毁掉优质电影
  2. Windows Server 2012 下载
  3. 安卓毕业设计app项目基于Uniapp+SSM实现的安卓的掌上校园系统食堂缴费图书馆预约
  4. 计算机项目uniapp(毕设课设)之 含文档+PPT+源码等]精品基于Uniapp+SSM的安卓的掌上校园系统食堂缴费图书馆预约
  5. mc服务器中怎样打开指令显示,mc服务器指令
  6. 飞思卡尔单片机教程(1)——从安装开始
  7. 【matlab之QQ图】
  8. ICCV2017 论文浏览记录(转)
  9. 电子邮箱账号是如何注册的?可以注册免费的电子邮箱账号么?
  10. 黑苹果,蓝牙折腾经历