import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.awt.Color;
import javax.imageio.ImageIO;
/*
* @author zzf
* @date 2019年1月14日 下午3:53:47
*/
public class ImageDemo {
public static void main(String[] args) throws IOException {
final String base = "龓鑫森我爱朋你可友中五么小三二一 ";// 从复杂到简单
final String path = "C:\\Users\\11577\\Desktop\\timg_副本.jpg";
OutputStream out=new FileOutputStream(new File("D:\\a.txt"));
//创建字节流缓冲区,加快写出速度
BufferedOutputStream bout=new BufferedOutputStream(out);
//创建字符输出流对象
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(bout, "utf-8"));
//获取图片
final BufferedImage image = ImageIO.read(new File(path));
//读取图片的像素,高度为8个每行,宽度为4个每行
for (int y = 0; y < image.getHeight(); y += 8) {
for (int x = 0; x < image.getWidth(); x += 4) {
final int pixel = image.getRGB(x, y);//得到这个点ARGB像素值
//获取r,g,b的值
// final int
// r = (pixel & 0xff0000) >> 16,
// g = (pixel & 0xff00) >> 8,
// b = pixel & 0xff;
Color color=new Color(pixel);
//将rgb值转化成灰度值,这里r、g、b之前的常数是固定值,这个公式是rgb转换灰度值的一种加权常用算法
final float gray = 0.299f * color.getRed() + 0.587f * color.getGreen() + 0.114f * color.getBlue();
//这里base我们是自己设置的,长度为n,然后加1,然后灰度值与这个值乘法,然后再做除法,
//最终得到的index值得范围为0-n+1,可以知道值越小,颜色越黑,反之越白
final int index = Math.round(gray * (base.length() + 1) / 255);
//如果index的值在0-n范围就对应的使用base字符串中对应位置的字符代替,超出范围的用空白代替
String pixels=index >= base.length() ? " " : String.valueOf(base.charAt(index));
bw.write(pixels);
//因为空格在txt文件中间隔小所以要再加两个
if(pixels.equals(" ")) {
bw.write(" ");
bw.write(" ");
}
System.out.print(pixels);
}
bw.write("\r\n");
System.out.println();
}
bw.close();
bout.close();
out.close();
}
}
这里我用一张猪做试验:
最后效果图:
ok,下面再看下将图片转灰度图片:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/*
* @author zzf
* @date 2019年1月14日 下午3:53:47
*/
public class ImageDemoTwo {
public static void main(String[] args) throws IOException {
final String path = "C:\\Users\\11577\\Desktop\\QQ截图20190115100010.png";
//获取图片
final BufferedImage image = ImageIO.read(new File(path));
//读取每个图片的像素
for (int y = 0; y < image.getHeight(); y ++ ) {
for (int x = 0; x < image.getWidth(); x ++) {
final int pixel = image.getRGB(x, y);//得到这个点ARGB像素值
//获取r,g,b的值
// final int
// r = (pixel & 0xff0000) >> 16,
// g = (pixel & 0xff00) >> 8,
// b = pixel & 0xff;
Color color=new Color(pixel);
//将rgb值转化成灰度值,这里r、g、b之前的常数是固定值,这个公式是rgb转换灰度值的一种加权常用算法
final float gray = 0.299f * color.getRed() + 0.587f * color.getGreen() + 0.114f * color.getBlue();
image.setRGB(x, y,new Color((int) gray,(int) gray,(int) gray).getRGB());
}
}
ImageIO.write(image, "png", new File("D:\\a.png"));
}
}
ok~nice