android马赛克代码,android图片马赛克 mosaic
android图片马赛克 mosaic
https://github.com/shenkaige/andtools/blob/master/src/com/phodev/andtools/utils/MosaicProcessor.java
1.[图片] mosaic.jpg
2.[代码][Java]代码
package com.phodev.andtools.utils;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Rect;
/**
* mosaic processor
*
* @author sky
*
*/
public class MosaicProcessor {
public static final int min_mosaic_block_size = 4;
private MosaicProcessor() {
}
/**
*
* @param bitmap
* @param targetRect
* @param blockSize
* {@link #min_mosaic_block_size}
* @return
* @throws Exception
*/
public static Bitmap makeMosaic(Bitmap bitmap, Rect targetRect,
int blockSize) throws OutOfMemoryError {
if (bitmap == null || bitmap.getWidth() == 0 || bitmap.getHeight() == 0
|| bitmap.isRecycled()) {
throw new RuntimeException("bad bitmap to add mosaic");
}
if (blockSize < min_mosaic_block_size) {
blockSize = min_mosaic_block_size;
}
if (targetRect == null) {
targetRect = new Rect();
}
int bw = bitmap.getWidth();
int bh = bitmap.getHeight();
if (targetRect.isEmpty()) {
targetRect.set(0, 0, bw, bh);
}
//
int rectW = targetRect.width();
int rectH = targetRect.height();
int[] bitmapPxs = new int[bw * bh];
// fetch bitmap pxs
bitmap.getPixels(bitmapPxs, 0, bw, 0, 0, bw, bh);
//
int rowCount = (int) Math.ceil((float) rectH / blockSize);
int columnCount = (int) Math.ceil((float) rectW / blockSize);
int maxX = bw;
int maxY = bh;
for (int r = 0; r < rowCount; r++) { // row loop
for (int c = 0; c < columnCount; c++) {// column loop
int startX = targetRect.left + c * blockSize + 1;
int startY = targetRect.top + r * blockSize + 1;
dimBlock(bitmapPxs, startX, startY, blockSize, maxX, maxY);
}
}
return Bitmap.createBitmap(bitmapPxs, bw, bh, Config.ARGB_8888);
}
/**
* 从块内取样,并放大,从而达到马赛克的模糊效果
*
* @param pxs
* @param startX
* @param startY
* @param blockSize
* @param maxX
* @param maxY
*/
private static void dimBlock(int[] pxs, int startX, int startY,
int blockSize, int maxX, int maxY) {
int stopX = startX + blockSize - 1;
int stopY = startY + blockSize - 1;
if (stopX > maxX) {
stopX = maxX;
}
if (stopY > maxY) {
stopY = maxY;
}
//
int sampleColorX = startX + blockSize / 2;
int sampleColorY = startY + blockSize / 2;
//
if (sampleColorX > maxX) {
sampleColorX = maxX;
}
if (sampleColorY > maxY) {
sampleColorY = maxY;
}
int colorLinePosition = (sampleColorY - 1) * maxX;
int sampleColor = pxs[colorLinePosition + sampleColorX - 1];// 像素从1开始,但是数组层0开始
for (int y = startY; y <= stopY; y++) {
int p = (y - 1) * maxX;
for (int x = startX; x <= stopX; x++) {
// 像素从1开始,但是数组层0开始
pxs[p + x - 1] = sampleColor;
}
}
}
}
android马赛克代码,android图片马赛克 mosaic相关推荐
- android 怎么代码把图片切成两半,android – 将RelativeLayout分成两半
试试这个布局.如果不完美,这应该适用于一些变化.这将添加两个图表. android:layout_width="fill_parent" android:layout_height ...
- android滴滴打车代码,Android 端滴滴打车接口的开发
前两天做了一个对Android端'滴滴打车'的接口开发吧! 今天来做个简单的流程, 滴滴会提供这样一个接口, http://webapp.diditaxi.com.cn/? maptype=wgs&a ...
- android 共享代码,Android团队成员间的代码共享!(Git+Github版)
原创,转载请说明出处. 一. 这篇文章要解决什么问题,能学习到什么? 在android团队的开发中,少不了与队员之间的合作.为了避免我们傻瓜式地复制粘贴对方的负责的那部分功能代码,我们可以用svn或者 ...
- 名片夹android布局代码,Android自定义布局实现仿qq侧滑部分代码
自定义布局实现仿qq侧滑部分Android代码,供大家参考,具体内容如下 实现说明: 通过自定义布局实现: SlidingLayout继承于 HorizontalScrollView /** * Cr ...
- 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...
本文将带你了解Android应用开发Android获取手机品牌.手机型号.手机唯一序列号的代码教程,希望本文对大家学Android有所帮助. Android获取手机品牌.手机型号.手机唯一序列号的代码 ...
- android gravity 代码,android:layout_gravity和android:gravity属性的区别
android:gravity / android:layout_gravity区别: android:gravity 是设置该view类里面的内容相对于该view的位置,例如设置button里面的t ...
- android扔骰子代码,Android实现掷骰子效果
本文实例为大家分享了android实现掷骰子效果的具体代码,供大家参考,具体内容如下 利用handler接受子线程的消息完成骰子点数的不断更替 演示 start:开始游戏 stop:停止游戏 reco ...
- android linearlayout 代码,Android如何从代码向另一个LinearLayout添加Linearlayout
我在main.xml中有一个LinearLayout: android:layout_width="match_parent" android:layout_height=&quo ...
- android摄像头代码,Android摄像头
[android]代码库import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStrea ...
最新文章
- 【转】 ADO.NET最佳实践
- Bootstrap 模态对话框只加载一次 remote 数据的解决办法
- oracle10g rac升级到10.2.0.5
- [深度学习-实践]tensorflow_hub简单理解模型的生成与加载
- PhotoSwipe源码解读系列(二)
- Java开发笔记(八十八)文件字节I/O流
- 构建大型网站架构服务器集群(转)
- Linux串口驱动分析read
- windows server 2008 远程桌面(授权、普通用户登录)
- 微信公众号运营辅助工具汇总
- day1.数据库初步了解
- vista/win7系统 红警/CS/星际争霸 局域网连接方法
- 弹出停止U盘安全删除硬件的命令
- 变分法求解最优控制问题推导思路
- java版怎么安装mod_java – 如何在Mac OS X上安装mod_jk
- 开源中文切词工具介绍
- 【Windows 11】系统安装修改版 Subsystem for Android 安卓子系统,并用 Magisk Root
- NIT 股市风云 按位与运算 F. 休赛季的引援#2
- idead导入maven多模块
- 数据安全技术研究国外
热门文章
- opencv已知相机投影及内参求外参_一步步用c++实现相机标定(张氏标定法)
- python怎么读取csv文件-使用Python读写csv文件的三种方法
- python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
- python教程视频下载-python怎么下载视频
- 用python画简单的图案-使用 Python Turtle 设计简单而又美丽的图形
- python 代码命令大全-深度学习中python常用命令
- php url参数用–,php获取URL各部分参数
- 马克思知识点总结(一)
- LeetCode 718最长重复子数组
- 常用编码软件简单使用记录 2 : 非自主编码器