不多废话,先上几张效果图:





其实也是闲着无聊,偶然间看到网上一篇博客,介绍了window10的cmd可以使用 ANSI转义显示彩色字或背景(点我查看学习资料),感觉突然来了点灵感,cmd的黑白控制台尽然也可以显示这么多颜色!那我是不是可以拿它来画画了!哈哈,所以就有了下面的尝试.直接上java工具代码:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 图片转化为cmd批处理文件** @author 子牙* @date 2019年11月32日 下午13:55:40*/
public class Pic2CMD {/*** 读取图片并生成输出cmd图像** @param path      图片输入路径* @param pix       图片需要按多少像素扫描(意思就是你的图按多少像素截取一个小方块)* @param makeBat   需要在图片路径下输出一个同名批处理文件么* @param showColor true在控制台打印图像,false在控制台打印颜色中文(主要是调试)*/private void createAsciiPic(String path, int pix, boolean makeBat, boolean showColor) {StringBuilder stringBuilder = new StringBuilder("@echo off\n");try {File imf = new File(path);final BufferedImage image = ImageIO.read(new File(path));int lines = image.getHeight() / pix;int cols = image.getWidth() / pix;
//            stringBuilder.append("title ").append(imf.getName().split("\\.")[0]).append("\n");stringBuilder.append("mode con cols=").append(cols * 2 + 2).append(" lines=").append(lines + 2).append("\n");for (int y = 0; y < image.getHeight(); y += pix) {stringBuilder.append("echo ");for (int x = 0; x < image.getWidth(); x += pix) {final int pixel = image.getRGB(x, y);//转化RGB值final int r = (pixel & 0xff0000) >> 16, g = (pixel & 0xff00) >> 8, b = pixel & 0xff;//输出该像素点的颜色stringBuilder.append(getYS(r, g, b, showColor));System.out.print(getYS(r, g, b, showColor));}System.out.print("\u001B[0m");System.out.println();stringBuilder.append("\n");}stringBuilder.append("pause");//需要输出文件的话执行if (makeBat) {File outFile = new File(path.split("\\.")[0] + "-" + pix + ".cmd");FileOutputStream fop = new FileOutputStream(outFile);fop.write(stringBuilder.toString().getBytes());fop.flush();fop.close();//打开这个批处理文件,用来预览
//                Runtime.getRuntime().exec("cmd /k start " + outFile.getAbsolutePath());}} catch (Exception e) {e.printStackTrace();}}/*** 控制台颜色*/class MColor {/*** 颜色名*/String name;/*** 对应RGB数组*/int[] RGB;/*** 颜色转义代码*/String colorCode;MColor(String name, int[] RGB, String colorCode) {this.name = name;this.RGB = RGB;this.colorCode = colorCode;}}/*** 根据RGB值判断应该对应的控制台颜色** @param r* @param g* @param b* @param showColor* @return*/private String getYS(int r, int g, int b, boolean showColor) {String w = "  ";//批处理中打印的字符,建议是2个空格//将所有cmd可输出的颜色输入,颜色是用的微信截图工具查看的RGB值,可能有误差MColor 黑 = new MColor("黑", new int[]{12, 12, 12}, "\u001B[40m" + w);MColor 红 = new MColor("红", new int[]{197, 15, 31}, "\u001B[41m" + w);MColor 绿 = new MColor("绿", new int[]{19, 161, 14}, "\u001B[42m" + w);MColor 黄 = new MColor("黄", new int[]{193, 156, 0}, "\u001B[43m" + w);MColor 蓝 = new MColor("蓝", new int[]{0, 55, 218}, "\u001B[44m" + w);MColor 紫 = new MColor("紫", new int[]{136, 23, 152}, "\u001B[45m" + w);MColor 灰紫 = new MColor("灰紫", new int[]{58, 150, 221}, "\u001B[46m" + w);MColor 淡灰 = new MColor("淡灰", new int[]{204, 204, 204}, "\u001B[47m" + w);MColor 灰 = new MColor("灰", new int[]{118, 118, 118}, "\u001B[100m" + w);MColor 淡红 = new MColor("淡红", new int[]{231, 72, 86}, "\u001B[101m" + w);MColor 淡绿 = new MColor("淡绿", new int[]{22, 198, 12}, "\u001B[102m" + w);MColor 淡黄 = new MColor("淡黄", new int[]{249, 241, 165}, "\u001B[103m" + w);MColor 淡蓝 = new MColor("淡蓝", new int[]{59, 120, 255}, "\u001B[104m" + w);MColor 酒红 = new MColor("酒红", new int[]{180, 0, 158}, "\u001B[105m" + w);MColor 天蓝 = new MColor("天蓝", new int[]{97, 214, 214}, "\u001B[106m" + w);MColor 白 = new MColor("白", new int[]{242, 242, 242}, "\u001B[107m" + w);final List<MColor> colorList = Arrays.asList(黑, 红, 绿, 黄, 蓝, 紫, 灰紫, 淡灰, 灰, 淡红, 淡绿, 淡黄, 淡蓝, 酒红, 天蓝, 白);double minDiff = Double.MAX_VALUE;//最接近的颜色MColor minColor = 白;//计算该RGB值与哪个控制台颜色最接近for (MColor mColor : colorList) {int dR = Math.abs(mColor.RGB[0] - r);int dG = Math.abs(mColor.RGB[1] - g);int dB = Math.abs(mColor.RGB[2] - b);//计算3个值的方差,方差越小,则表示越接近该颜色double diff = Math.sqrt(Math.pow(dR, 2) + Math.pow(dG, 2) + Math.pow(dB, 2));//找出最小的方差颜色if (diff < minDiff) {//新的颜色比最小的还小,则将最小替换为新的minDiff = diff;minColor = mColor;}}return showColor ? minColor.colorCode : minColor.name;}private List<File> showDirectoryFiles(File file) {File[] files = file.listFiles();List<File> fileList = new ArrayList<>();for (File a : files) {
//            System.out.println(a.getAbsolutePath());if (a.isDirectory()) {showDirectoryFiles(a);}fileList.add(a);}return fileList;}public static void main(final String[] args) {Pic2CMD pic = new Pic2CMD();//读取一个文件夹下所有图片格式文件File file = new File("C:/Users/Administrator/Desktop/demo");for (File file1 : pic.showDirectoryFiles(file)) {if (file1.getName().contains("jpg") || file1.getName().contains("png")) {//批量生成pic.createAsciiPic(file1.getAbsolutePath(), 10, true, true);}}}
}

注释写的还算可读,稍微解释一下原理,首先CMD部分的原理很简单,就是一些特殊的ANSI转义字符可以显示彩色的背景,因此可以在控制台打印出彩色的空格,这个是基础,可以参看上面的链接自己尝试.

然后就是需要告诉控制台我要在哪些地方输出什么颜色的字符,输出多少,说白了就是要解决画画的问题.这一步我采用java实现,我们使用BufferedImage读取一张图片,然后按照我们设定的扫描像素,一格一格的识别图片中的RGB色值,并且我们将图片的RGB色值与控制台可以输出的颜色做一个对比,找到最接近的那个颜色,打印出来就可以了.

因为控制台支持的颜色比较少,只有16种,因此我们是没办法完美的输出图片中的颜色的,所以这边我采用简单的一种类似方差的概念去判断图片中的颜色和哪个控制台颜色最接近,这可能是关键代码了吧(请忽略颜色的中文命名,为了好记).

使用过程中需要注意的点就是:

  1. 生成的.cmd文件貌似只能用在win10及以上的版本,win7好像不支持这些转义字符(不过貌似win7也可以输出彩色字).
  2. 需要转化的像素图尽量颜色和控制台的颜色要相近,不然效果不是很好.附上控制台的颜色支持图:

@echo offecho [40m                    40
echo [41m                    41
echo [42m                    42
echo [43m                    43
echo [44m                    44
echo [45m                    45
echo [46m                    46
echo [47m                    47
echo [100m                    100
echo [101m                    101
echo [102m                    102
echo [103m                    103
echo [104m                    104
echo [105m                    105
echo [106m                    106
echo [107m                    107
pause
  1. 转化图片时,因为每一个图片的最小像素单位可能不一样,所以传入的像素参数需要你自己修改到合适.

最后附上几张像素图和对应已经转化好的代码,大家有兴趣的可以自己再桌面上运行看看_.

@echo off
mode con cols=30 lines=16
title Pokemon
echo [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m
echo [107m  [107m  [40m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [40m  [107m  [107m
echo [107m  [40m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [40m  [107m
echo [40m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [40m
echo [40m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [40m
echo [40m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [41m  [40m
echo [40m  [41m  [41m  [41m  [41m  [41m  [40m  [40m  [40m  [41m  [41m  [41m  [41m  [41m  [40m
echo [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m
echo [40m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [40m
echo [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m
echo [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m
echo [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m
echo [107m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [107m
echo [107m  [107m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [107m  [107m
echo [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m
pause


上面的代码会画出一个精灵球

@echo off
title Super Man
mode con cols=54 lines=30
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [40m  [40m  [103m  [103m  [40m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [103m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [103m  [103m  [40m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [103m  [103m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [103m  [40m  [107m  [103m  [103m  [103m  [40m  [107m  [103m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [40m  [40m  [103m  [103m  [103m  [40m  [40m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [103m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [41m  [40m  [40m  [103m  [103m  [103m  [103m  [103m  [40m  [40m  [41m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [40m  [41m  [40m  [44m  [44m  [40m  [40m  [40m  [40m  [40m  [44m  [44m  [40m  [41m  [40m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [40m  [41m  [40m  [44m  [44m  [44m  [41m  [41m  [41m  [41m  [41m  [44m  [44m  [44m  [40m  [41m  [40m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [40m  [41m  [40m  [44m  [44m  [40m  [44m  [41m  [43m  [43m  [43m  [41m  [44m  [40m  [44m  [44m  [40m  [41m  [40m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [40m  [41m  [40m  [103m  [103m  [44m  [40m  [44m  [44m  [41m  [41m  [41m  [44m  [44m  [40m  [44m  [103m  [103m  [40m  [41m  [40m  [107m  [107m  [107m
echo [107m  [107m  [40m  [41m  [41m  [40m  [103m  [103m  [40m  [40m  [44m  [44m  [44m  [41m  [44m  [44m  [44m  [40m  [40m  [103m  [103m  [40m  [41m  [41m  [40m  [107m  [107m
echo [107m  [107m  [40m  [41m  [41m  [41m  [40m  [40m  [41m  [40m  [44m  [44m  [44m  [44m  [44m  [44m  [44m  [40m  [41m  [40m  [40m  [41m  [41m  [41m  [40m  [107m  [107m
echo [107m  [107m  [40m  [41m  [41m  [41m  [41m  [41m  [41m  [40m  [43m  [41m  [43m  [43m  [43m  [41m  [43m  [40m  [41m  [41m  [41m  [41m  [41m  [41m  [40m  [107m  [107m
echo [107m  [107m  [107m  [40m  [41m  [41m  [41m  [41m  [40m  [44m  [44m  [44m  [44m  [44m  [44m  [44m  [44m  [44m  [40m  [41m  [41m  [41m  [41m  [40m  [107m  [107m  [107m
echo [107m  [107m  [107m  [40m  [41m  [41m  [41m  [41m  [40m  [41m  [44m  [44m  [40m  [40m  [40m  [44m  [44m  [41m  [40m  [41m  [41m  [41m  [41m  [40m  [107m  [107m  [107m
echo [107m  [107m  [107m  [40m  [40m  [41m  [41m  [40m  [40m  [41m  [41m  [40m  [41m  [41m  [41m  [40m  [41m  [41m  [40m  [40m  [41m  [41m  [40m  [40m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [41m  [41m  [41m  [40m  [40m  [40m  [40m  [40m  [41m  [41m  [41m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [40m  [40m  [40m  [40m  [40m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
echo [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m  [107m
pause

上面是画出一个超人,和原图对比,几乎一摸一样吧

好了,大家还有其他什么好看好玩的图也可以尝试自己把它转为cmd格式的,画出来看看

[好玩的CMD]CMD批处理绘制彩色的像素画相关推荐

  1. window cmd bat批处理杀端口对应的进程

    window cmd bat批处理杀端口对应的进程,把代码复制到一个文本中,然后将后缀名改为bat,然后使用管理员权限运行,有时候不需要,直接输入对应的端口就可以杀掉该端口下的进程了 @echo of ...

  2. R语言CRAN不包含的安装包下载并手动使用RStudio进行安装实战:以下载VRPM包及绘制彩色列线图为例

    R语言CRAN不包含的安装包下载并手动使用RStudio进行安装实战:以下载VRPM包及绘制彩色列线图为例 目录

  3. 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

    文章目录 一.设置线宽度 二.绘制单条线段 GL_LINES 三.绘制多条线段 GL_LINES 四.绘制依次连接的点组成的线 GL_LINE_STRIP 五.绘制圈 GL_LINE_LOOP ( 偶 ...

  4. OpenGL 绘制彩色三角形的实例

    OpenGL 绘制彩色三角形 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <sb7.h> #define INTERPOLATE_ ...

  5. Android开发(1):随机绘制彩色实心圆

    本文介绍了如何利用Android的绘图技术随机绘制彩色实心圆.效果如图1所示.                       图1 这个程序的核心是画布,也就是Canvas对象.要想在Canvas上绘制 ...

  6. VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor

    目录 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor 接上:VC++ 绘制线条 OnLButtonDown函数 ...

  7. python绘制彩色六边雪花

    python代码 #绘制彩色6分支的雪花 #导入模块 import turtle import random colors=["pink","green",&q ...

  8. 用python画螺旋图案_用Python绘制彩色螺旋矩阵

    本文章小编教大家使用Python海龟绘制彩色螺旋矩阵,下面是相关代码块的解析,仅供喜爱python的小伙伴们学习参考. 1. 导入turtle库 from turtle import* 2.设置画布背 ...

  9. matlab绘制彩色多边形和灰色多边形

    绘制彩色多边形 绘制彩色多边形很简单,只要有一些顶点坐标或者其他的一些信息就可以使用patch.fill等函数进行绘制.具体参考手册和其他网络内容 fill手册 patch手册 绘制灰度多边形 比如你 ...

最新文章

  1. IPFS: Merkle DAG数据结构
  2. linux cut 命令(转)
  3. bugku ——加密 做题记录
  4. python像素处理_Python+OpenCV图像处理(五)—— 像素运算
  5. word交叉引用插入文献后更新域之后编号未更新
  6. java mysql nclob_java向oracle数据库Clob读取,写入数据
  7. j3455跑mysql_看烦了千篇一律的J3455?让黑群晖显示真实的CPU信息
  8. java 加密\解密工具类
  9. “2021年度全球十大人工智能治理事件”:数据、算法、伦理受关注,AI发展需治理同行
  10. android win10 驱动安装失败,解决在win10系统下小米手机驱动安装失败的具体步骤...
  11. 微信公众号后台开发---永久素材失效
  12. CreateThread与_beginthread 内存泄漏的本质
  13. ACL2021_Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter
  14. 腾讯防水墙php接入,PHP实现腾讯防水墙验证码校验
  15. 全网最全编程学习网站汇总
  16. win10文件服务器ssd当缓存盘,Win10怎么启用设备上的写入缓存|提高固态硬盘性能方法...
  17. SVN :找不到这样的主机
  18. 抖音微信消息推送情侣告白浪漫(简易版)
  19. 用Excel计算个人工资所得税的四套方案(转)
  20. LJ5.1 - 水下可见光通信UVLC研究进展

热门文章

  1. shell脚本的人机石头剪刀布游戏
  2. js使用正则表达式去掉前后空格
  3. 在html中写单选按钮事件,在HTML中如何设置单选按钮
  4. Pandora Boot和spring Boot
  5. 运维之道 | Redis 命令解析大全
  6. Excel合并工作表的神器mdash;Power Query
  7. CDH和HDP下载地址
  8. java 取当前时间年月日_Java获取当前时间年月日的方法
  9. GSMS-华为应急通讯完美版 ISO文件下载
  10. 腾讯云直播-开启互动直播