2019独角兽企业重金招聘Python工程师标准>>>

Floyd-Steinberg抖动算法简直量身为价签这种低颜色呈现设备准备的。由于价签的墨水屏能够呈现的色彩非常有限,根据型号不同,有的只能显示黑白,有的只能显示黑白红,有的只能显示黑白黄,所以对于一张普通图片,需要将其转换为两色或者三色才能比较好地在价签上展示出来。

核心代码如下:

public class BMPConverter {public static RGBTriple[] getPalette(int deviceType) {final RGBTriple[] palette;if (deviceType == 0) {//黑白价签palette = new RGBTriple[]{new RGBTriple(0, 0, 0),new RGBTriple(255, 255, 255)};} else if (deviceType == 1) {//黑白红价签palette = new RGBTriple[]{new RGBTriple(0, 0, 0),new RGBTriple(255, 255, 255),new RGBTriple(255, 0, 0)};} else {//黑白黄价签palette = new RGBTriple[]{new RGBTriple(0, 0, 0),new RGBTriple(255, 255, 255),new RGBTriple(255, 255, 0)};}return palette;}public static byte[][] floydSteinbergDither(RGBTriple[][] image, RGBTriple[] palette){byte[][] result = new byte[image.length][image[0].length];for (int y = 0; y < image.length; y++) {for (int x = 0; x < image[y].length; x++) {RGBTriple currentPixel = image[y][x];byte index = findNearestColor(currentPixel, palette);result[y][x] = index;for (int i = 0; i < 3; i++){int error = (currentPixel.channels[i] & 0xff) - (palette[index].channels[i] & 0xff);if (x + 1 < image[0].length) {image[y+0][x+1].channels[i] =plus_truncate_uchar(image[y+0][x+1].channels[i], (error*7) >> 4);}if (y + 1 < image.length) {if (x - 1 > 0) {image[y+1][x-1].channels[i] =plus_truncate_uchar(image[y+1][x-1].channels[i], (error*3) >> 4);}image[y+1][x+0].channels[i] =plus_truncate_uchar(image[y+1][x+0].channels[i], (error*5) >> 4);if (x + 1 < image[0].length) {image[y+1][x+1].channels[i] =plus_truncate_uchar(image[y+1][x+1].channels[i], (error*1) >> 4);}}}}}return result;}private static byte plus_truncate_uchar(byte a, int b) {if ((a & 0xff) + b < 0) {return 0;} else if ((a & 0xff) + b > 255) {return (byte) 255;} else {return (byte) (a + b);}}private static byte findNearestColor(RGBTriple color, RGBTriple[] palette) {int minDistanceSquared = 255*255 + 255*255 + 255*255 + 1;byte bestIndex = 0;for (byte i = 0; i < palette.length; i++) {int Rdiff = (color.channels[0] & 0xff) - (palette[i].channels[0] & 0xff);int Gdiff = (color.channels[1] & 0xff) - (palette[i].channels[1] & 0xff);int Bdiff = (color.channels[2] & 0xff) - (palette[i].channels[2] & 0xff);int distanceSquared = Rdiff*Rdiff + Gdiff*Gdiff + Bdiff*Bdiff;if (distanceSquared < minDistanceSquared) {minDistanceSquared = distanceSquared;bestIndex = i;}}return bestIndex;}}public class  RGBTriple {public final byte[] channels;public RGBTriple() { channels = new byte[3]; }public RGBTriple(int R, int G, int B){ channels = new byte[]{(byte)R, (byte)G, (byte)B}; }
}

原始图片:

黑白红价签的显示效果:

黑白价签的显示效果:

转载于:https://my.oschina.net/u/4042451/blog/3058233

使用Floyd-Steinberg抖动算法处理价签图片相关推荐

  1. 使用Atkinson抖动算法处理价签图片

    找了好久Atkinson的Java实现,始终没找到现成的,只有一个pde的参考: https://github.com/danielepiccone/dithering_algorithms/blob ...

  2. Android 各种图片转黑白图和抖动算法的黑白图

    最近做的关于打印机打印图片的项目,需要将图片转为打印机能打的点阵位图.我参考了很多文章,但是也没有说的很详细的,其中流浪的鱼的csdn博客写的比较详细,但是,半路出家的Android菜鸟,表示没看太懂 ...

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

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

  4. floyd 判圈算法 UVa 11549 计算器谜题

    题目http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. leetcode202(Floyd判圈算法(龟兔赛跑算法))

    Write an algorithm to determine if a number is "happy". 写出一个算法确定一个数是不是快乐数. A happy number ...

  6. Floyd判圈算法(Floyd's cycle detection

    Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm).该算法由美国科学家罗伯特·弗洛伊德发明 ...

  7. 坐在马桶上看算法:只有五行的Floyd最短路算法

    坐在马桶上看算法:只有五行的Floyd最短路算法 此算法由Robert W. Floyd(罗伯特·弗洛伊德)于1962年发表在"Communications of the ACM" ...

  8. floyd判环算法(龟兔赛跑算法)

    floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链+一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的). (图不是我的) 如果只要求环的 ...

  9. 【啊哈!算法】算法6:只有五行的Floyd最短路算法

            暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

最新文章

  1. python软件是免费的吗-Python编程软件下载
  2. Android Studio错误代码汇总
  3. c 冒泡排序_C语言中选择排序和冒泡排序
  4. 信号传递的时机与顺序
  5. 最难啃的《深度学习》圣经花书,居然新出版了视频课!
  6. 宿州学院省二计算机什么时候报名,宿州学院2017年9月全国计算机等级考试报名时间及报名网址公布...
  7. 本人译著《Professional Xcode 3》现已翻译完毕
  8. 【Webcam设计】总结与代码仓库
  9. 软件开发常用设计模式—单例模式总结(c++版)
  10. 多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论
  11. 树莓派HDMI转VGA线有无源
  12. 2008 r2 server sql 中文版补丁_sql server 2008 r2 sp4下载-SQL Server 2008 sp4补丁3264位 简体中文完整版-东坡下载...
  13. JavaSE个人复习式整理知识点之函数式接⼝、Stream流、⽅法引⽤
  14. 博士最惨能惨到什么程度?
  15. 大学生日记 我走出了农村 却永远走不进城市
  16. 生成一维码条码码,扫码查询相关条码信息
  17. 帝国理工计算机软件工程,帝国理工学院计算机软件工程理学硕士
  18. 小游戏活动策划(全)
  19. 最新和讯网社会责任指数(超详细指标)
  20. PHP Linux监控文件变化,文件监控与通知机制 audit inotify

热门文章

  1. Sitecore 9 介绍
  2. 2023年软件测试行业还值得入行吗?
  3. 周娟56.com(我乐网)CEO访谈
  4. 计算机组装与维修_教学大纲,计算机专业组装与维修教学大纲.pdf
  5. 使用nginx反向代理突然失灵
  6. 安卓开发学习-Android Studio-13-表格视图、日历
  7. IDEA while 生成Iterator快捷键
  8. 如何实现流畅观影体验?视频类应用内存和CPU大调查 1
  9. 如何进行项目风险评估
  10. 外贸常用结算方式(信用证)