博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java实现图像灰度化
阅读量:5064 次
发布时间:2019-06-12

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

  /*在研究Java实现将一张图片转成字符画的时候,发现将图像转化字符串是根据照片的灰度采用不同的字符画出来,形成一个灰度表。于是就研究了下关于灰度值这个东西,于是跳了一个大坑。。。因为鄙人用的ubuntu,所以我的代码路径会有所不同。直接贴出原博文代码。故事的开始是这样的。。。*/

  1.关于Java实现将一张图片转成字符画(原文地址:http://blog.csdn.net/zhouli_05/article/details/7913263

    怎么样用Java实现将一张图片转成字符画??

    输入:一张图片

    输出:一个txt文档,由字符构成,看起来很像那张照片的字符画。

    基本思想:根据照片的灰度采用不同的字符画出来,形成一个灰度表。

    #首先在D盘写一个文件"temp.html",如下内容

    

1  2  3   4   图片转文本 5   
6 11 12 13 14 ${content}15 16
View Code 

 

 

    #在D盘放一个图片(放小一点的)"a.jpg"
     #运行如下JAVA代码:
1 import java.awt.Color;  2 import java.awt.image.BufferedImage;  3 import java.io.File;  4 import java.io.FileInputStream;  5 import java.io.FileOutputStream;  6 import java.io.IOException;  7 import java.io.InputStreamReader;  8 import javax.imageio.ImageIO;  9  10 public class Test { 11  12  /** 此处设置灰度字符,此处只用十个字符,可以设置更多 */ 13  private static char[] cs = new char[] { '.', ',', '*', '+', '=', '&', '$', '@', '#', ' ' }; 14  15  public static void main(String[] args) throws IOException { 16  17   // 读取图片 18   BufferedImage bfedimage = ImageIO.read(new File("D:\\a.jpg")); 19  20   // 图片转字符串后的数组 21   char[][] css = new char[bfedimage.getWidth()][bfedimage.getHeight()]; 22  23   for (int x = 0; x < bfedimage.getWidth(); x++) { 24    for (int y = 0; y < bfedimage.getHeight(); y++) { 25     int rgb = bfedimage.getRGB(x, y); 26     Color c = new Color(rgb); 27     // 得到灰度值 28     int cc = (c.getRed() + c.getGreen() + c.getBlue()) / 3; 29     css[x][y] = cs[(int) ((cc * 10 - 1) / 255)]; 30    } 31   } 32  33   // 取得模板HTML 34   String temp = readFile(new File("D:\\temp.html"),"gbk"); 35   StringBuffer sb = new StringBuffer(); 36  37   // 开始拼接内容 38   for (int y = 0; y < css[0].length; y++) { 39    for (int x = 0; x < css.length; x++) { 40     sb.append(css[x][y]); 41    } 42    sb.append("\r\n"); 43   } 44  45   System.out.println(sb.toString()); 46   // 生成文件 47   String content = toHTML(sb.toString()); 48   String filecontent = replaceStrAllNotBack(temp, "${content}", content); 49   writeFile(new File("D:\\content.html"), filecontent, "gbk"); 50  } 51  52  public static String toHTML(String s) { 53   s = s.replaceAll("&", "&"); 54   s = s.replaceAll(" ", " "); 55   s = s.replaceAll(">", ">"); 56   s = s.replaceAll("<", "<"); 57   s = s.replaceAll("\"", """); 58   s = s.replaceAll("\\\r\\\n", "
"); 59 s = s.replaceAll("\\\r", "
"); 60 s = s.replaceAll("\\\n", "
"); 61 return s; 62 } 63 64 public static String replaceStrAllNotBack(String str, String strSrc, String strDes) { 65 StringBuffer sb = new StringBuffer(str); 66 int index = 0; 67 while ((index = sb.indexOf(strSrc, index)) != -1) { 68 sb.replace(index, index + strSrc.length(), strDes); 69 index += strDes.length(); 70 } 71 return sb.toString(); 72 } 73 74 /** 75 * 读文件(使用默认编码) 76 * 77 * @param file 78 * @return 文件内容 79 * @throws IOException 80 */ 81 public static String readFile(File file, String charset) throws IOException { 82 InputStreamReader fr = new InputStreamReader(new FileInputStream(file), charset); 83 StringBuffer sb = new StringBuffer(); 84 char[] bs = new char[1024]; 85 int i = 0; 86 while ((i = fr.read(bs)) != -1) { 87 sb.append(bs, 0, i); 88 } 89 fr.close(); 90 return sb.toString(); 91 } 92 93 /** 94 * 写文件 95 * 96 * @param file 97 * @param string 98 * 字符串 99 * @param encoding100 * 编码101 * @return 文件大小102 * @throws IOException103 */104 public static int writeFile(File file, String string, String encoding) throws IOException {105 FileOutputStream fos = new FileOutputStream(file);106 try {107 byte[] bs = string.getBytes(encoding);108 fos.write(bs);109 return bs.length;110 } finally {111 fos.close();112 }113 }114 }
View Code
 
     #打开"D:\content.html"文件看效果吧。   // win环境下测试了一次,发现content.html中并没有出现效果。不过效果可以在终端看见。其他补充下次博文补充。。。   //开始入坑,发现程序是根据照片的灰度采用不同的字符画出来,形成一个灰度表,来实现画出来字符串的,然后就去科普下了一下。。。          #Java实现图像灰度化(原文地址:http://liuyu314.github.io/java/2014/05/24/grayscale/)      几种灰度化的方法:        1.分量法:使用RGB三个分量中的一个作为灰度图的灰度值。       2.最值法:使用RGB三个分量中最大值或最小值作为灰度图的灰度值。          3.均值法:使用RGB三个分量的平均值作为灰度图的灰度值。       4.加权法:由于人眼颜色敏感度不同,按下一定的权值对RGB三分量进行加权平均能得到较合理的灰度图像。一般情况按照:Y = 0.30R + 0.59G + 0.11B。       加权法实际上是取一幅图片的亮度值作为灰度值来计算,用到了YUV模型。(有兴趣的同学可以研究下伽马校正)。

      一种Java实现灰度化的方法

      注:System.getProperty();java可以通过System.getProperty获得系统变量的值。一种参数的获取 你可以在程序启动时 将不变的整个程序用到的参数 使用System.setProperty("","");存起来。

      如果你搜索“Java实现灰度化”,十有八九都是一种方法(代码):

1 public void grayImage() throws IOException{ 2     File file = new File(System.getProperty("user.dir")+"/test.jpg"); 3     BufferedImage image = ImageIO.read(file); 4        5     int width = image.getWidth();   6     int height = image.getHeight();   7        8     BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);  9     for(int i= 0 ; i < width ; i++){  10         for(int j = 0 ; j < height; j++){  11         int rgb = image.getRGB(i, j);  12         grayImage.setRGB(i, j, rgb);  13         }  14     }  15       16     File newFile = new File(System.getProperty("user.dir")+"/method1.jpg");  17     ImageIO.write(grayImage, "jpg", newFile);  18 }
View Code

      Java实现加权法灰度化

1 private static int colorToRGB(int alpha, int red, int green, int blue) { 2  3         int newPixel = 0; 4         newPixel += alpha; 5         newPixel = newPixel << 8; 6         newPixel += red; 7         newPixel = newPixel << 8; 8         newPixel += green; 9         newPixel = newPixel << 8;10         newPixel += blue;11 12         return newPixel;13 14 }15 public static void main(String[] args) throws IOException {16     BufferedImage bufferedImage 17         = ImageIO.read(new File(System.getProperty("user.dir" + "/test.jpg"));18     BufferedImage grayImage = 19         new BufferedImage(bufferedImage.getWidth(), 20                           bufferedImage.getHeight(), 21                           bufferedImage.getType());22         23     24     for (int i = 0; i < bufferedImage.getWidth(); i++) {25         for (int j = 0; j < bufferedImage.getHeight(); j++) {26             final int color = bufferedImage.getRGB(i, j);27             final int r = (color >> 16) & 0xff;28             final int g = (color >> 8) & 0xff;29             final int b = color & 0xff;30             int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);;31             System.out.println(i + " : " + j + " " + gray);32             int newPixel = colorToRGB(255, gray, gray, gray);33             grayImage.setRGB(i, j, newPixel);34         }35     }36     File newFile = new File(System.getProperty("user.dir") + "/ok.jpg");37     ImageIO.write(grayImage, "jpg", newFile);38 }
View Code

 两种方法得到的结果的差距还是很大的,我也根据原博文做了一次测试。下面贴图:       (原博文原图)

                            (Java实现灰度化的方法)
 
                                               (Java实现加权法灰度化)
 

 

转载于:https://www.cnblogs.com/qipa/p/5071479.html

你可能感兴趣的文章
Java Build Practice 4:Extend and Invoke Ant API
查看>>
[转] Transformer图解
查看>>
Linux 根文件系统制作
查看>>
IOS--沙盒机制
查看>>
使用 JointCode.Shuttle 访问任意 AppDomain 的服务
查看>>
sqlite的坑
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
Jquery ui widget开发
查看>>
更改git仓库地址
查看>>
有标号DAG计数 [容斥原理 子集反演 组合数学 fft]
查看>>
Recipe 1.4. Reversing a String by Words or Characters
查看>>
Rule 1: Make Fewer HTTP Requests(Chapter 1 of High performance Web Sites)
查看>>
sql注入
查看>>
「破解」Xposed强
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>