mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-31 20:02:27 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
36f1980a84
@ -0,0 +1,92 @@
|
|||||||
|
package net.mamoe.mirai.utils;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert IMAGE into Chars that could shows in terminal
|
||||||
|
* @author NaturalHG
|
||||||
|
*/
|
||||||
|
public class CharImageConverter implements Callable<String> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* width should depends on the width of the terminal
|
||||||
|
*/
|
||||||
|
private BufferedImage image;
|
||||||
|
private int width;
|
||||||
|
private double ignoreRate;
|
||||||
|
|
||||||
|
public CharImageConverter(BufferedImage image, int width){
|
||||||
|
this(image,width,0.95);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CharImageConverter(BufferedImage image, int width, double ignoreRate){
|
||||||
|
this.image = image;
|
||||||
|
this.width = width;
|
||||||
|
this.ignoreRate = ignoreRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String call(){
|
||||||
|
/*
|
||||||
|
* resize Image
|
||||||
|
* */
|
||||||
|
int newHeight = (int)(this.image.getHeight() * (((double)width) /this.image.getWidth()));
|
||||||
|
Image tmp = image.getScaledInstance(width, newHeight, Image.SCALE_SMOOTH);
|
||||||
|
BufferedImage dimg = new BufferedImage(width, newHeight, BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D g2d = dimg.createGraphics();
|
||||||
|
g2d.drawImage(tmp, 0, 0, null);
|
||||||
|
this.image = dimg;
|
||||||
|
|
||||||
|
int background = this.gray(image.getRGB(0,0));
|
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|
||||||
|
List<StringBuilder> lines = new ArrayList<>(this.image.getHeight());
|
||||||
|
|
||||||
|
int minXPos = this.width;
|
||||||
|
int maxXPos = 0;
|
||||||
|
|
||||||
|
for (int y = 0; y < image.getHeight(); y++) {
|
||||||
|
StringBuilder builderLine = new StringBuilder();
|
||||||
|
for (int x = 0; x < image.getWidth(); x++) {
|
||||||
|
int gray = this.gray(image.getRGB(x, y));
|
||||||
|
if (grayCompare(gray, background)) {
|
||||||
|
builderLine.append(" ");
|
||||||
|
} else {
|
||||||
|
builderLine.append("#");
|
||||||
|
if (x < minXPos) {
|
||||||
|
minXPos = x;
|
||||||
|
}
|
||||||
|
if (x > maxXPos) {
|
||||||
|
maxXPos = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (builderLine.toString().isBlank()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines.add(builderLine);
|
||||||
|
}
|
||||||
|
for (int i=0;i<lines.size();++i) {
|
||||||
|
builder.append(lines.get(i).substring(minXPos, maxXPos)).append("\n");
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int gray(int rgb) {
|
||||||
|
int R = (rgb & 0xff0000) >> 16;
|
||||||
|
int G = (rgb & 0x00ff00) >> 8;
|
||||||
|
int B = rgb & 0x0000ff;
|
||||||
|
int gray = (R * 30 + G * 59 + B * 11 + 50) / 100;
|
||||||
|
return (R * 30 + G * 59 + B * 11 + 50) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean grayCompare(int g1, int g2){
|
||||||
|
return ((double)Math.min(g1,g2)/Math.max(g1,g2)) >= ignoreRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,13 +1,6 @@
|
|||||||
package net.mamoe.mirai.utils;
|
package net.mamoe.mirai.utils;
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
/**
|
|
||||||
* 图片转字符图片, 来自 CSDN 开源
|
|
||||||
*
|
|
||||||
* @author zhoujie https://blog.csdn.net/qq_37902949/article/details/81228566
|
|
||||||
*/
|
|
||||||
public final class CharImageUtil {
|
public final class CharImageUtil {
|
||||||
|
|
||||||
public static String createCharImg(BufferedImage image) {
|
public static String createCharImg(BufferedImage image) {
|
||||||
@ -15,41 +8,7 @@ public final class CharImageUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String createCharImg(BufferedImage image, int sizeWeight, int sizeHeight) {
|
public static String createCharImg(BufferedImage image, int sizeWeight, int sizeHeight) {
|
||||||
//生成字符图片
|
return new CharImageConverter(image,sizeWeight).call();
|
||||||
image = resize(image, sizeWeight, sizeHeight);
|
|
||||||
int width = image.getWidth();
|
|
||||||
int height = image.getHeight();
|
|
||||||
|
|
||||||
StringBuilder output = new StringBuilder();
|
|
||||||
for (int i = 0; i < height; i++) {
|
|
||||||
StringBuilder line = new StringBuilder();
|
|
||||||
for (int j = 0; j < width; j++) {
|
|
||||||
int rgb = image.getRGB(j, i);
|
|
||||||
int R = (rgb & 0xff0000) >> 16;
|
|
||||||
int G = (rgb & 0x00ff00) >> 8;
|
|
||||||
int B = rgb & 0x0000ff;
|
|
||||||
int gray = (R * 30 + G * 59 + B * 11 + 50) / 100;
|
|
||||||
int index = 31 * gray / 255;
|
|
||||||
line.append(asc[index]); //添加每个字符
|
|
||||||
}
|
|
||||||
output.append(line).append("\n");
|
|
||||||
}
|
|
||||||
return output.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BufferedImage resize(BufferedImage img, int newW, int newH) {
|
|
||||||
Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
|
|
||||||
BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);
|
|
||||||
|
|
||||||
Graphics2D g2d = dimg.createGraphics();
|
|
||||||
g2d.drawImage(tmp, 0, 0, null);
|
|
||||||
g2d.dispose();
|
|
||||||
|
|
||||||
return dimg;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static char[] asc = {' ', '`', '.', '^', ',', ':', '~', '"',
|
|
||||||
'<', '!', 'c', 't', '+', '{', 'i', '7', '?', 'u', '3', '0', 'p', 'w',
|
|
||||||
'4', 'A', '8', 'D', 'X', '%', '#', 'H', 'W', 'M'};
|
|
||||||
|
|
||||||
}
|
}
|
14
mirai-core/src/test/java/ImageOutputTest.java
Normal file
14
mirai-core/src/test/java/ImageOutputTest.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import net.mamoe.mirai.utils.CharImageConverter;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ImageOutputTest {
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
BufferedImage image = ImageIO.read(new File((System.getProperty("user.dir") + "/VerificationCode.png").replace("//","/")));
|
||||||
|
CharImageConverter charImageConvertor = new CharImageConverter(image,100);
|
||||||
|
System.out.println(charImageConvertor.call());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user