弄了一下午,始终不能得到较好的效果
主要是计算灰度值,再计算出对应字符
灰度值计算方法:
效果:
原图:
代码
package com.j;
import com.sun.jndi.toolkit.url.UrlUtil;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.util.Scanner;
/**
* @author joker
* @version 1.0
* @description 将图片转为Ascii,
* 灰度算法1-->0.299:0.587:0.114
* 灰度算法2-->平均值
* @date 2020-04-07 -- 11:28
*/
public class ImgAscii {
//ascii字符表,美观的影响先决之一
//BBB@@@###$$$%%%OOOEEE!!!===***^^^```+++,,,---...
static char[] ascii = "@#&$%*o!;.".toCharArray();
//默认路径
static String staticUrl = "C:\\Users\\Administrator\\Desktop\\";
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
//路径获取
Scanner scanner = new Scanner(System.in);
System.out.println("输入对应路径:");
String Url = scanner.next();
//处理图片
deal(Url);
System.out.println("判断成功");
}
}
/**
* @param Url 对应路径
*/
public static void deal(String Url) {
BufferedImage image = null;
//获取图片
try {
image = ImageIO.read(new File(staticUrl + Url));
StringBuilder stringBuilder = new StringBuilder("");
//获取像素,横向
//i,j影响结果大小效果
for (int i = 0; i < image.getHeight(); i += 2) {
for (int j = 0; j < image.getWidth(); j += 1) {
//像素点
final int rgbpx = image.getRGB(j, i);
//计算像素
final int r = (rgbpx & 0xff0000) >> 16, g = (rgbpx & 0xff00) >> 8, b = (rgbpx & 0xff);
//灰度计算
final float grey = r * 0.299f + g * 0.587f + b * 0.114f;
//final int grey = (r + g + b) / 3;
//System.out.println(grey);
//灰度转换为对应字符
final int index = Math.round(grey * (ascii.length + 1) / 255);
//final int index = grey * (ascii.length + 1)/255;
if (index >= ascii.length) {
stringBuilder.append(" ");
//System.out.print(" ");
} else {
stringBuilder.append(ascii[index]);
//System.out.print(ascii[index]);
}
}
stringBuilder.append("\n");
//System.out.println();
}
File AscImg = new File(System.getProperty("user.dir") + "\\temp.txt");
if (!AscImg.exists()) {
AscImg.createNewFile();
}
FileWriter w = new FileWriter(AscImg);
BufferedWriter writer = new BufferedWriter(w);
writer.write(stringBuilder.toString());
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
有点可远观,不可亵玩的感觉