将位图转换为 ASCII 艺术 [英] Convert bitmap to ASCII art
问题描述
这样的图像转换算法是如何工作的?
How does such an image conversion algorithm work?
我想将位图转换为 ASCII 艺术.谁能帮我看看我应该使用什么样的算法?
I want to convert a bitmap to ASCII art. Can anyone help me out what sort of algorithm should I use?
. W ,
W W @
W ,W W
, W, :W* .W .
# WW @WW WW #
W WW.WWW WW: W
W. WW*WWW# WW@ W
* :WW.WWWWWWW@WWW@W #
+* #WW#WWWWWWWWWWWWW# W
W# @WWWWWWWWWWWWWWWWW W
WW WWWWWWWWWWWWWWWWWW W
WW WWWWWWWWWWWWWWWWWW@W#
,WW.WWWWWWWWWWWWWWWWWWWWW
WW@WWWWWWWWWWWWWWWWWWWWW
: WWWWWWWWWWWWWWWWWWWWWWWW :
@ WWWWWWWW@WWWWWWW@@WWWWWW.
W*WWWWWW::::@WWW:::::#WWWWW
WWWWWW@:: :+*:. ::@WWWW
WWWWW@:*:.:: .,.:.:WWWW
@WWWW#:.:::. .:: #:@WWW
:WWW@:#. :: :WWWW:@WWWW
WWW#*:W@*@W . W:#WWW
#WWWW:@ :: :: *WWWW
W@WW*W .::,.::::,:+ @@WW#,
WWWW## ,,.: .:::.: . .WWW:,
@WWW@: W..::::: #. :WWWW
WWWW:: *..:. ::.,. :WWWW
WWWW:: :.:.: : :: ,@WW@
WWWW: .:, : ,, :WW,
.: # : , : *
W + ., ::: ., : @
W :: .: W
@,,,W:. ,, ::*@*:, . :@W.,,@
+.....*: : : .#WWWWW: : .#:....+,
@...:::*:,, : :WWWWWWW, , *::::..,#
:...::::::W:, @W::::*W. :W:::::...#
@@@@@@@@@@@W@@@@@W@@@@@@W@@@@@W@@@@@@@@@@:
推荐答案
将图像转换为 ASCII 艺术
尺寸.假设一个字符的平均高度是其宽度的两倍,为了保持相同的比例,我们必须缩小原始图像.因此,使用等宽字体是有意义的.
Convert image to ASCII art
Size. Let's assume that one character is on average twice as high as its wide, and in order to maintain the same proportions, we have to scale down the original image. Therefore, it makes sense to use monospaced fonts.
颜色.我们可以根据字符的密度将像素的亮度转换为字符.因此,转换高对比度的灰度或黑白图像更准确.
Color. We can convert the brightness of a pixel to a character depending on the density of the character. Therefore, it is more accurate to convert grayscale or black and white images with high contrast.
原图:
缩放后的 ASCII 图片:
Scaled ASCII picture:
<头>
scH=16, scW=8
scH=8, scW=4
scH=2, scW=1
class ImageToASCIIArt { public static void main(String[] args) throws IOException { char[][] chars = readImage("/tmp/image.jpg", 16, 8); writeToFile("/tmp/image.txt", chars); } static char[][] readImage(String path, int scH, int scW) throws IOException { BufferedImage image = ImageIO.read(new File(path)); int height = image.getHeight() / scH; int width = image.getWidth() / scW; char[][] chars = new char[height][width]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { // scaling image and accumulating colors int colorRGB = 0; for (int k = 0; k < scH; k++) for (int p = 0; p < scW; p++) colorRGB += image.getRGB(j * scW + p, i * scH + k); // get the average color Color color = new Color(colorRGB / (scH * scW)); // read the R, G, B values of the color and get the average brightness int brightness = (color.getRed()+color.getGreen()+color.getBlue()) / 3; // get a character depending on the brightness value chars[i][j] = getDensity(brightness); } } return chars; } static final String DENSITY = "@QB#NgWM8RDHdOKq9$6khEPXwmeZaoS2yjufF]}{tx1zv7lciL/\\|?*>r^;:_\"~,'.-`"; static char getDensity(int value) { // Since we don't have 255 characters, we have to use percentages int charValue = (int) Math.round(DENSITY.length() / 255.0 * value); charValue = Math.max(charValue, 0); charValue = Math.min(charValue, DENSITY.length() - 1); return DENSITY.charAt(charValue); } static void writeToFile(String path, char[][] chars) throws IOException { FileWriter writer = new FileWriter(path); for (char[] row : chars) { String str = String.valueOf(row); writer.append(str).write("\n"); System.out.println(str); } writer.flush(); writer.close(); } }
另见:从 ASCII 艺术作品中恢复图像 • 从图像中绘制 ASCII 艺术
这篇关于将位图转换为 ASCII 艺术的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文登录 关闭
扫码关注1秒登录发送“验证码”获取 | 15天全站免登陆