[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

控制台图形显示工具IMG.EXE

本帖最后由 happy886rr 于 2016-11-13 00:34 编辑

强悍的控制台图形显示工具,支持jpg、png、bmp、gif(首帧)显示。内置脚本解析器,可以完成简单的goto跳转功能,用“::行号?循环次数”完成goto 跳转。使用gdiplus图形库;体积小巧、速度迅捷、功能实用、浅析脚本。
IMG.EXE
图片存为a.zip解压即是

-----------------------------------------------------------------------------
THE CONSOLE DISPLAYS PICTURE TOOL, VERSION 1.2, COPYRIGHT@2016~2018 BY HAPPY

img [options]
-----------------------------------------------------------------------------
    :                            Hide the cursor
    :::[time]                    Delay ms
    :::::                        Show images in desktop
    ::[L]?[CYC]                  Cycle CYC times from row L
    +{parameters}                Cyclic accumulator
    [imgfile]                    Direct display imgfile
    [imgfile]:{parameters}       Display the image with the given parameters
             :{parameters}       Erase the display with the given parameters
    [scriptfile]::[m],[n]        Get commands from [m] to [n] in the sfile
_____________________________________________________________________________
强悍的控制台图形显示工具,支持jpg、png、bmp、gif(首帧)显示。内置脚本解析器,
可以完成简单的goto跳转功能,用“::行号”完成goto 跳转。
_____________________________________________________________________________
隐藏光标
img :

延时500毫秒
:::500

在CMD窗口外显示图片
img :::::

省参数图形显示
img test.jpg

参数自动补全
img test.jpg:8,16
img test.jpg:8,16,100,200
img test.jpg:8,16,100,200,50,20

八参数图形显示
img test.jpg:cmd_x, cmd_y, size_W, size_H, src_x, src_y, disp_W, disp_H

擦除指定选区
img :start_cmd_x, end_cmd_x, start_cmd_y, end_cmd_y

从脚本中执行第3行到第8行
img test.txt::3,8

_____________________________________________________________________________
goto跳转语句 //::行号?循环次数
::12?80

循环累加器
+0,0,10,0
test.jpg:0,0,0,-1
::1?80

循环擦除
+0,0,10,0
test.jpg:0,0,0,-1
+0,10
:-10,0,0,800
::1?80

图片放大
:
:::::
+0,0,10,0
test.jpg:0,0,0,-1
::3?80
_____________________________________________________________________________


编译:
  1. gcc img.c -std=gnu99 -O3 -s -lgdi32 -lgdiplus -oimg.exe
复制代码
源码:
  1. /*
  2. THE CONSOLE DISPLAYS A PICTURE TOOL, VERSION 1.2
  3. IMG.EXE
  4. COPYRIGHT@2016~2018 BY HAPPY
  5. */
  6. //编译参数
  7. //gcc img.c -std=gnu99 -O3 -s -lgdi32 -lgdiplus -oimg.exe
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <stdbool.h>
  11. #include <windows.h>
  12. #include <gdiplus\gdiplus.h>
  13. //定义参数行
  14. char* ARGS[16];
  15. //定义计步器
  16. int PEDO[9]={0};
  17. //引入WINAPI
  18. HWND WINAPI GetConsoleWindow();
  19. HWND   hCMD;
  20. //图形结构体
  21. typedef struct{
  22.     HBITMAP hBitmap;
  23.     int Width;
  24.     int Height;
  25. }IMAGE;
  26. /***************图形函数群***************/
  27. //图形加载
  28. IMAGE LoadImg(char *file, int _nWidth, int _nHeight)
  29. {
  30. GpImage*     thisImage;
  31. GpGraphics*  graphics=NULL;
  32. ULONG_PTR    gdiplusToken;
  33. IMAGE       _img;
  34. GdiplusStartupInput GSI={1, NULL, false, false};
  35. HDC hdc=GetDC(NULL);
  36. HDC hdcMem=CreateCompatibleDC(hdc);
  37. int nLen=MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, file, -1, NULL, 0);
  38. if(nLen==0){
  39. exit(1);
  40. }
  41. wchar_t* wfile=(wchar_t*)malloc(sizeof(wchar_t)*nLen);
  42. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, file, -1, wfile, nLen);
  43. GdiplusStartup(&gdiplusToken, &GSI, NULL);   
  44. if( GdipLoadImageFromFile(wfile, &thisImage) ){
  45. fputs("Load image error.\n", stdout);
  46. exit(2);
  47. }
  48. GdipGetImageWidth(thisImage, &_img.Width);
  49. GdipGetImageHeight(thisImage, &_img.Height);
  50. if      (_nHeight==-1 && _nWidth !=-1){
  51. _img.Height=(int)( (_img.Height*1.0 / _img.Width) * (_nWidth ) );
  52. _img.Width =_nWidth;
  53. }else if(_nWidth ==-1 && _nHeight!=-1){
  54. _img.Width =(int)( (_img.Width*1.0 / _img.Height) * (_nHeight) );
  55. _img.Height=_nHeight;
  56. }else if(_nHeight !=0 ){
  57. _img.Width =_nWidth;
  58. _img.Height=_nHeight;
  59. }
  60. _img.hBitmap=CreateCompatibleBitmap(hdc, _img.Width, _img.Height);
  61. SelectObject(hdcMem, _img.hBitmap);
  62. GdipCreateFromHDC(hdcMem, &graphics);
  63. GdipDrawImageRectI(graphics, thisImage, 0, 0, _img.Width, _img.Height);
  64. GdipDisposeImage(thisImage);
  65. GdipDeleteGraphics(graphics);
  66. DeleteDC (hdcMem);
  67. ReleaseDC(NULL, hdc);
  68. GdiplusShutdown(gdiplusToken);
  69. return _img;
  70. }
  71. //绘图函数
  72. int DrawImg(
  73. char* imgfile,           //图形文件
  74. int cmd_x,  int cmd_y,   //相对于cmd窗口位置
  75. int size_W, int size_H,  //图片的显示宽高
  76. int src_x,  int src_y,   //对相原图 截取位置
  77. int disp_W, int disp_H   //要显示多少宽高
  78. ){
  79. cmd_x +=PEDO[0]*PEDO[1], cmd_y +=PEDO[0]*PEDO[2];
  80. size_W+=PEDO[0]*PEDO[3], size_H+=PEDO[0]*PEDO[4];
  81. src_x +=PEDO[0]*PEDO[5], src_y +=PEDO[0]*PEDO[6];
  82. disp_W+=PEDO[0]*PEDO[7], disp_H+=PEDO[0]*PEDO[8];
  83. PEDO[0]=0;
  84. IMAGE P   =LoadImg(imgfile, size_W, size_H);
  85. HDC   hCUR=GetDC(hCMD);
  86. HDC   hSRC=CreateCompatibleDC(hCUR);
  87. SelectObject(hSRC, P.hBitmap);
  88. if(disp_W !=0){
  89. P.Width =disp_W, P.Height=disp_H;
  90. }
  91. BitBlt(hCUR, cmd_x, cmd_y, P.Width, P.Height, hSRC, src_x, src_y, SRCCOPY);
  92. DeleteObject(P.hBitmap);
  93. ReleaseDC(hCMD, hCUR);
  94. DeleteDC(hSRC);
  95. return 0;
  96. }
  97. //擦除画布
  98. int CleanImg(
  99. HWND  hd,     //句柄
  100. LONG  left,   //左坐标
  101. LONG  right,  //右坐标
  102. LONG  top,    //上坐标
  103. LONG  bottom  //底坐标
  104. ){
  105. RECT  z={left+PEDO[0]*PEDO[1], top+PEDO[0]*PEDO[3], right+PEDO[0]*PEDO[2], bottom+PEDO[0]*PEDO[4]};
  106. InvalidateRect(hd, &z, true);
  107. return 0;
  108. }
  109. /***************功能函数群***************/
  110. //隐藏光标
  111. void HideCursor()
  112. {
  113.         CONSOLE_CURSOR_INFO cursor_info={1,0};
  114.         SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
  115. }
  116. //查找字符
  117. int strchp(const char* Str, const char delim)
  118. {
  119. int i=-1;
  120. while(Str[++i]!='\0'){
  121. if(Str[i]==delim){
  122. return i;
  123. }
  124. }
  125. return -1;
  126. }
  127. //切分参数
  128. int args(char* Str, int FLAG)
  129. {
  130. int i=0;
  131. if(FLAG==1){
  132. ARGS[i]=strtok(Str,  ":");
  133. }else{
  134. ARGS[i]=strtok(Str+1,",");
  135. }
  136. while(ARGS[i]!=NULL){ARGS[++i]=strtok(NULL,",");}
  137. return i;
  138. }
  139. //读取脚本
  140. int FileScript(char* txtfile, int m, int n);
  141. //参数分析
  142. int AnalysiTreatment(char* command)
  143. {
  144. int i=0, j=strchp(command, ':');
  145. switch(j){
  146. case -1:
  147. if(
  148. command[0]!='\0'&&
  149. command[0]!='\r'&&
  150. command[0]!='\t'&&
  151. command[0]!=' '
  152. ){
  153. DrawImg(command, 0, 0, 0, 0, 0, 0, 0, 0);
  154. }
  155. break;
  156. case  0:
  157. i=args(command, 0);
  158. if      (i==4){
  159. CleanImg(hCMD, atol(ARGS[0]), atol(ARGS[1]), atol(ARGS[2]), atol(ARGS[3]));
  160. }else if(
  161. command[1]=='\0'||
  162. command[1]=='\r'||
  163. command[1]=='\t'||
  164. command[1]==' '
  165. ){
  166. HideCursor();
  167. }else{
  168. fputs("Error options.\n",stdout);
  169. }
  170. break;
  171. default:
  172. i=args(command, 1);
  173. if      (command[j+1]==':' && i==3){
  174. FileScript(ARGS[0], atoi(ARGS[1]+1), atoi(ARGS[2]));
  175. }else if(command[j+1]==':' && i==2){
  176. FileScript(ARGS[0], atoi(ARGS[1]+1), atoi(ARGS[1]+1));
  177. }else if(i==3){
  178. DrawImg(ARGS[0], atoi(ARGS[1]), atoi(ARGS[2]), 0,0,0,0,0,0);
  179. }else if(i==5){
  180. DrawImg(ARGS[0], atoi(ARGS[1]), atoi(ARGS[2]), atoi(ARGS[3]), atoi(ARGS[4]), 0,0,0,0);
  181. }else if(i==7){
  182. DrawImg(ARGS[0], atoi(ARGS[1]), atoi(ARGS[2]), atoi(ARGS[3]), atoi(ARGS[4]), atoi(ARGS[5]), atoi(ARGS[6]), 0,0);
  183. }else if(i==9){
  184. DrawImg(ARGS[0], atoi(ARGS[1]), atoi(ARGS[2]), atoi(ARGS[3]), atoi(ARGS[4]), atoi(ARGS[5]), atoi(ARGS[6]), atoi(ARGS[7]), atoi(ARGS[8]));
  185. }else{
  186. fputs("Error options.\n",stdout);
  187. }
  188. break;
  189. }
  190. return 0;
  191. }
  192. //读取脚本
  193. int FileScript(char* txtfile, int m, int n)
  194. {
  195. FILE* fp;
  196. int i=0, j=0, k=0, c=0, MARK_PRE=0, MARK=0, MAX_ARGC=0;
  197. n=(n<0||n<m)?2147483618:n;
  198. if( (fp=fopen(txtfile, "rb"))==NULL ){
  199. fputs("Failed to read file.\n", stdout);
  200. exit(3);
  201. }
  202. char* Line=(char*)malloc(1024*sizeof(char));
  203. while(!feof(fp)){
  204. memset(Line, 0,  1024*sizeof(char));
  205. fgets(Line, 1023, fp);
  206. i++;
  207. if(
  208. Line[0]=='\0'||
  209. Line[0]=='\r'||
  210. Line[0]=='\t'||
  211. Line[0]==' '
  212. ){
  213. continue;
  214. }
  215. if(Line[0]=='+'){
  216. MAX_ARGC=args(Line, 0);
  217. for(j=0; j<MAX_ARGC; j++){
  218. PEDO[j+1]=atoi(ARGS[j]);
  219. }
  220. PEDO[0]=k;
  221. continue;
  222. }
  223. if(
  224. Line[0]==':'&&
  225. Line[1]==':'
  226. ){
  227. if(
  228. Line[2]!=':'&&
  229. i>=MARK_PRE
  230. ){
  231. k++;
  232. if(k==c){
  233. k=0;
  234. continue;
  235. }
  236. m=atoi(strtok(Line+2,"?"));
  237. c=atoi(strtok(NULL,  "?"));
  238. MARK_PRE=i, i=0;
  239. fseek(fp, 0, SEEK_SET);
  240. }
  241. else if(
  242. Line[2]==':'&&
  243. i>=m
  244. ){
  245. if(Line[3]==':'&&Line[4]==':'){
  246. hCMD=GetDesktopWindow();
  247. }else{
  248. Sleep(atoi(Line+3));
  249. }
  250. }
  251. continue;
  252. }
  253. if(m<=i && i<=n){
  254. AnalysiTreatment(Line);
  255. }
  256. }
  257. free(Line);
  258. fclose(fp);
  259. return 0;
  260. }
  261. /*************MAIN主函数入口*************/
  262. int main(int argc, char** argv)
  263. {
  264. if(argc==2){
  265. hCMD=GetConsoleWindow();
  266. AnalysiTreatment(argv[1]);
  267. return 0;
  268. }
  269. fputs(
  270. "THE CONSOLE DISPLAYS A PICTURE TOOL, VERSION 1.2\n"
  271. "COPYRIGHT@2016~2018 BY HAPPY\n"
  272. "-------------------------------------------------------------------------\n"
  273. "img [options]\n"
  274. "-------------------------------------------------------------------------\n"
  275. "    :                        Hide the cursor\n"
  276. "    :::[time]                Delay ms\n"
  277. "    :::::                    Show images in desktop\n"
  278. "    ::[L]?[CYC]              Cycle CYC times from row L\n"
  279. "    +{parameters}            Cyclic accumulator\n"
  280. "    [imgfile]                Direct display imgfile\n"
  281. "    [imgfile]:{parameters}   Display the image with the given parameters\n"
  282. "             :{parameters}   Erase the display with the given parameters\n"
  283. "    [scriptfile]::[m],[n]    Get commands from [m] to [n] in the sfile\n"
  284. "-------------------------------------------------------------------------\n"
  285. ,stdout
  286. );
  287. exit(1);
  288. }
复制代码


还真是做技术和开发的料子啊。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

本帖最后由 523066680 于 2016-11-12 09:05 编辑

嗖噶,有时候还是windows提供的接口比较省事。
比如之前用iconv就觉得有点繁琐,用 stringapiset.h 还直接

不过winapi 上面有一点我觉得很难接受,就是类型的命名感觉很别扭:
  DWORD, LPCTSTR, LRESULT, HWND

TOP

应该是图片显示吧

TOP

回复 2# codegay
就是用来辅助批处理动画、游戏的,用这个可以放大缩小图片,后续还会添加图像旋转,gif解码,图形变换,伪3D等特效技术。之后还会写个3dimg.exe,用来在控制台窗口显示3d图形、3d建模,3d演示;由于是C语言构建,加上算法每天在不断的优化,性能貌似总比其他语言强太多。而img是一个浅析脚本,img有自己的脚本风格,且支持bat混编。
  1. @echo off&img %~nx0::3,-1&exit /b
  2. >>>IMG图显脚本
  3. :
  4. +0,0,10,0
  5. test.jpg:0,0,0,-1
  6. +0,10
  7. :-10,0,0,800
  8. :::10
  9. >>>
  10. ::12?80
  11. +10,0,0,0
  12. test.jpg:0,0,0,0
  13. +0,10
  14. :-10,0,0,800
  15. :::10
  16. >>>
  17. ::10?80
复制代码
我只得出一个结论:在相同算法前提下,C语言比其他所有高级语言都快,python的大数运算很快,但我用C语言实现的大数运算速度是python的100倍,用C语言实现的其他项目也比C++写的快2到3倍。不过C语言开发效率很慢,你得清楚底层原理,有时还得用内联汇编,一天才写三四百行,慢的要死。
1

评分人数

TOP

回复 3# 523066680
微软那些类型名称,我也看得眼花,正如windows系统,其实只是新瓶装旧酒,微软的一贯作风。

TOP

回复 4# pcl_test
是的,只是比bmp.exe功能多了几项,支持的图片格式多了几种,支持img自己的脚本。

TOP

回复 7# happy886rr


    版主的意思可能是,字面上,图形和图像包含的东西不一样。图像是像素化的,图形可能是矢量的。(逃

TOP

骚年,我看好你哦
话说能丰富一下注释更好...(然而自己的都没加)捂脸...逃

TOP

感谢大师提醒,只是自己对语言掌握还不是很熟练,很多非常高深的数学变换,不知道该如何用程序语言去描述。这也是一个思维的转变,就是你必须学会机器的思维过程,写机器能理解的代码。机器喜欢做加法、位运算,所以你要尽量把代码里的乘法除法改成加法或位运算。同时,C语言的位运算速度令我惊呆了。

TOP

回复 10# happy886rr


    Xp x64光荣测试失败了

TOP

回复 11# 老刘1号


    很正常,这个调用的是gdi32.dll  你的64位xp可能存在兼容性问题。

TOP

回复 12# happy886rr


    好吧……

TOP

回复 13# 老刘1号
对了,你再试一下image能否在64xp下工作。

TOP

你是不是用的64位的cmd

TOP

返回列表