最近做的关于打印机打印图片的项目,需要将图片转为打印机能打的点阵位图。我参考了很多文章,但是也没有说的很详细的,其中流浪的鱼的csdn博客写的比较详细,但是,半路出家的Android菜鸟,表示没看太懂,而且那个BufferImage,Android里也没有,又下了个GpuImage处理库,发现效果都不是我想要的,于是,自己看了抖动算法原理,自己写了个。首先,打印机只能通过你传输的数据0或1,来执行打还是不打,打,只能打黑点。所以,传过去的图像像素需要进行判断,到底是打黑点还是不打。

处理方法,先将图片转为灰度图,这个就不说了,方法一大把,你可以自己套用灰度图的算法公式;得到图像的像素数组

int width = img.getWidth();         //获取位图的宽  
int height = img.getHeight();       //获取位图的高

int[] pixels = new int[width * height]; //通过位图的大小创建像素点数组

img.getPixels(pixels, 0, width, 0, 0, width, height);

再套公式:int gray = (int)(0.299 * (double)tr + 0.587 * (double)tg + 0.114 * (double)tb);

Pixels[index] = (ta << 24) | (gray << 16) | (gray << 8) | gray;

当然,Android里有转灰度图的方法,直接调用,就可以得到了;

/***
* 图片去色,返回灰度图片
* @param bmpOriginal 传入的图片
* @return 去色后的图片
*/
public static Bitmap toGrayscale(Bitmap bmpOriginal) {
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();

Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}

不用写复杂的算法是不是很爽?!

开始,我用的是二值法来处理,就是用127做临界值,来判断灰度图的灰度是否比他大,大就打白,小就打黑;结果,效果不太理想,如果是文本类的Logo,和颜色分布不密集的,可以选择这样打,但是相片,风景图之类的,我只能说,我要吐了。颜色密集的,就是一片黑,或者一片白。过段不行。

好,用平均值,取所有像素的灰度和,再除以像素个数,得到这个临界值,发现,然并卵。和二值法没有太大区别。

恩嗯,没的选了,只能Floyd-Steinberg算法了。首先,介绍下Floyd-Steinberg算法的原理。它是利用误差的扩散算法的Floyd-Steinberg抖动算法来对图像进行二值化处理。

例如,灰度如的灰度值为g,误差值为e。遍历每个像素值,灰度如果大于m(127,或者像素灰度平均值,看你喜欢),那么pixels【i】=#ffffffff,打白,e=g-255;否则,打黑,pixels【i】=#ff000000,e=g;然后,这个像素点的右边,下边,和右下方的像素点,对应的加上3e/8,3e/8,e/4。最后你的到的像素数组在转成bitmap,就是抖动的单色图了。

public Bitmap convertGreyImgByFloyd(Bitmap img) {

int width = img.getWidth();         //获取位图的宽  
int height = img.getHeight();       //获取位图的高

int[] pixels = new int[width * height]; //通过位图的大小创建像素点数组

img.getPixels(pixels, 0, width, 0, 0, width, height); 
int[] gray=new int[height*width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int grey = pixels[width * i + j]; 
int red = ((grey  & 0x00FF0000 ) >> 16); 
gray[width*i+j]=red;
}
}

int e=0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int g=gray[width*i+j];
if (g>=128) {
pixels[width*i+j]=0xffffffff;
e=g-255;

}else {
pixels[width*i+j]=0xff000000;
e=g-0;
}
if (j<width-1&&i<height-1) {
//右边像素处理
gray[width*i+j+1]+=3*e/8;
//下
gray[width*(i+1)+j]+=3*e/8;
//右下
gray[width*(i+1)+j+1]+=e/4;
}else if (j==width-1&&i<height-1) {//靠右或靠下边的像素的情况
//下方像素处理
gray[width*(i+1)+j]+=3*e/8;
}else if (j<width-1&&i==height-1) {
//右边像素处理
gray[width*(i)+j+1]+=e/4;
}
}

}

Bitmap mBitmap=Bitmap.createBitmap(width, height, Config.RGB_565);
mBitmap.setPixels(pixels, 0, width, 0, 0, width, height);

return mBitmap; 
}

这个方法,你只需要传入得到的灰度图bitmap对象,就可以返回一个抖动处理过的黑白图。因为自己也才开始做Android开发,博客也是第一次写,平时也主要是看别人的博客在学习。考虑到和我一样的新手,处理这个问题会比较困难,就写了这个。参考的思路主要是鱼神的。我写的,是给新手直接用的。不怎么会,图片不会传。有问题欢迎留言。

Android 各种图片转黑白图和抖动算法的黑白图相关推荐

  1. Android——SVG图片转成安卓能用的vector矢量图

    背景 矢量图能不受显示范围大小的限制且不失真,不需要放多套PNG图片来做适配,能随意自己更改矢量图的大小而不再需要去求同事给新切图. 而我目前所在的公司出图放在蓝湖上,能选择下载PNG或SVG格式的图 ...

  2. android 分享图片到朋友圈 大小限制,朋友圈传播图的尺寸是多少?朋友圈图片大小限制...

    不知道小伙伴们有没有在微信上做过活动,比如什么集赞换取什么东西,比如说点赞即可获取门票之类的.这类活动要想在朋友圈做好,那么一个好的朋友圈活动图就显得很是必要.那么小伙伴们知道朋友圈传播图的尺寸是多少 ...

  3. android 启动图片 大小,ios 和安卓常用图标、启动图 尺寸

    ---------------------------------------------ios---------------------------------------------------- ...

  4. 算法基础:图的相关算法知识笔记

    一.图的相关算法 1.图的分类知识 如下图: 2.生成树概念 对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树. 连通图的生成树具有这样的特征:边的数量 = 顶点数 - ...

  5. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  6. 【图神经网络】图神经网络(GNN)学习笔记:图分类

    图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...

  7. android将彩图转为黑白_android 彩色图片二值化转可打印的点阵黑白图

    最近有一个需求,需要在手机上生成黑白图传给蓝牙设备显示出来. 一开始我在网上找了一个转黑白图片的方法,这个方法的逻辑是 用127做临界值,来判断灰度图的灰度是否比他大,大就打白,小就打黑,代码和效果图 ...

  8. Android 墨水屏黑白红色阶算法和抖动算法,拿过去直接用

    Android 墨水屏黑白红色阶算法和抖动算法, 拿过去直接用, 有问题直接下面问 色阶法 一张图像,我们可以把它划分为几个大的颜色域,图像上的每个像素点根据颜色跟这几个色域的趋近程度,被划分到这些颜 ...

  9. 图片一:单通道、三通道、灰度图、黑白图、三通道转灰度图(单通道)

    图片的概念经常搞不清楚,导致对图片处理很糟糕.感觉还是总结下比较好,省的每次都要找一堆博客看.下面的内容是博主个人理解,不能保证全部正确,如有错误,敬请指出. 1.图片:通常指的是数字图片,数据结构通 ...

最新文章

  1. socket 中 SOCK_STREAM 和 SOCK_DGRAM的区别?
  2. poj - 3254 Corn Fields (状态压缩dp入门)
  3. mysql牵引例子_MySQL学习06(事务和索引)
  4. 图神经网络(GNN)综述
  5. linux新建用户切换后显示-bash-4.1$(转载)
  6. 剑指offer面试题17. 打印从1到最大的n位数
  7. 分布式ID生成器解决方案
  8. 因为计算机丢失chromeelf.dll,win10系统打开QQ空间提示chrome_elf.dll丢失的解决方法...
  9. 网页唤起QQ在线聊天
  10. [模拟]JZOJ 2499 东风谷早苗
  11. 可以在idle内部执行python命令_2、Python IDLE入门
  12. 剑指Offer-46:把数字翻译成字符串
  13. 苹果屏幕尺寸_iPhone 12屏幕维修价格出炉,比iPhone 11贵多少?
  14. 2021年云计算前景如何
  15. 请教高手(关于视频语音聊天室)
  16. 转载-java学习公众号15000 字的 SQL 语句大全
  17. 2022年6月25日PMP考试通关宝典-6
  18. OpenSSL-3.0.3编程—封装EVP摘要计算为C++类EvpDigest
  19. FPGA如何将.bdf文件转换成.v文件
  20. class常量池、运行时常量池 和 字符串常量池 的区别

热门文章

  1. 关于中兴客户认证端破解的猜想
  2. endo-BCN-PEG4-Palmitic,环丙烷环辛炔四聚乙二醇-Palmitic包装灵活
  3. windows office 界面改进(续)
  4. nmap端口扫描安装以及使用
  5. 再php用if语句实现成绩,php switch语句的使用
  6. 学术写作之逻辑推理(Logical Reasoning)
  7. tar解压单个文件到特定目录_Linux解压文件到指定目录
  8. 民间生活小秘方|怎么戒酒| 怎么戒烟|怎样除去口臭
  9. wkwebview 文件服务器,WKWebView 的缓存策略
  10. 长尾关键词优化 如何有效的去做长尾关键词