user-0 提问: 请教一个问题 用纯C语言怎么写一个DOS界面显示图片的程序？

回复:
user: user-1
content: 引用 25 楼 cdcxy2009 的回复:补充一句： 在DOS下其实可以做出很漂亮的图形界面和各类菜单的，只是现在没人需要这么做了，以前做了不少 谁敢说DOS下的3DS Studio界面不漂亮？！

user: user-2
content: 补充一句： 在DOS下其实可以做出很漂亮的图形界面和各类菜单的，只是现在没人需要这么做了，以前做了不少

user: user-2
content: 这个工作我在很多年前做过的，没那么难，做些图像显示，画个运转的时钟，都不难。 你最好找一下turbo C的函数库，里面有专门的图像处理部分； 如果针对某种格式的图像显示，可能需要先了解图像格式编码规则。  另外：如果希望运行速度快一些，可以直接操纵显卡内存，当然这个需要你对内存寻址比较熟悉才行，弄不好会崩溃的。

user: user-3
content: 引用 16 楼 gz_qmc 的回复:楼主要的是这个吗?  怀旧！

user: user-4
content: 第一步:要用VESA设置真彩色的显示模式 第二步:要有BMP,PCX,JPG等图片文件格式的解码代码 第三步:要用XMS将图片数据保存起来并COPY到显存  你对VESA啊,XMS啊这些概念都都一无所知的话 谈思路有何用 源代码程序一堆 你看不懂的 就算你明白了VESA的概念 还要用到BIOS中断来实现 你知道中断的概念吗? 又不知道的话 那完蛋了  好吧,给个简单的思路 你总该会写点函数吧 Putpixel(int x,int y,int color) 就是在x,y点显示color颜色的  那你只解析出图片文件里的颜色值 挨点显示就可以了嘛  祝你好运,骚年

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:楼主说的是 “用纯C语言怎么写一个DOS界面显示图片” 而不是 “用C语言怎么写一个纯DOS界面显示图片” 我需要一个在DOS界面下显示图片的程序额，用C语言写的 不要别的语言

user: user-0
content: 引用 16 楼 gz_qmc 的回复:楼主要的是这个吗?   我需要用c语言写一个在DOS界面显示图片的程序 你有代码么？

user: user-5
content: 引用 17 楼 Saleayas 的回复:这么古老的东西还有啊。 据说 Windows XP 都已经进博物馆收藏了。  真是孤陋寡闻！你知道什么叫古老！前段时间还在调试：DOS + vxWorks的启动界面，在DOS的实模式加载一副logo位图，然后退出SVGA，再进入vx系统，目的是不要长时间显示蓝屏界面。  看你干什么了！WinXP是硬件开发人员兼容性最好的平台！

user: user-1
content: 没纯DOS环境，可以在DosBox环境下试试。

user: user-4
content: 引用 17 楼 Saleayas 的回复:这么古老的东西还有啊。 据说 Windows XP 都已经进博物馆收藏了。 要说古老 孙子兵法几千年了 是应该先淘汰的吧  人的眼睛里只有蛋 鸡自然就没有任何价值  如果永远只肤浅的浮在表面 世界也就是一陀狗屎而已 更何况生命

user: user-6
content: 这么古老的东西还有啊。 据说 Windows XP 都已经进博物馆收藏了。

user: user-4
content: 楼主要的是这个吗?

user: user-7
content: 引用 4 楼 shimachao 的回复:这个很麻烦啊 不适合。  你可以先了解图片的格式，然后读取图片的每个一个像素。然后了解一下关于控制台的api。根据图片中的每一个像素来设置控制台的每一个像素。  我以前学16位汇编时，是可以设置控制台某一个地方的像素的。至于用的什么接口，我忘了。 感觉这个思路不错

user: user-8
content: 百度easyx

user: user-9
content: 上述代码不建议楼主贸然尝试....蓝屏妥妥的... C语言直接写GDI很容易这种结果

user: user-1
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <conio.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     SetTextColor(hdc,RGB(255,255,255));     SetBkMode(hdc,TRANSPARENT);     TextOut(hdc,210,30,"这个背景是泡泡",14);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-1
content: 用C语言写一个纯DOS界面显示图片（需要显卡支持VESA标准） Svga256.h /************************************************/ /*                      */ /*       SuperVGA 256 BGI driver defines    */ /*      Copyright (c) 1991      */ /*      Jordan Hargraphix Software      */ /*                      */ /************************************************/  #include <dos.h>  typedef unsigned char DacPalette256[256][3];  extern int far _Cdecl Svga256_fdriver[];  /* These are the currently supported modes */ #define SVGA320x200x256     0   /* 320x200x256 Standard VGA */ #define SVGA640x400x256     1   /* 640x400x256 Svga/VESA */ #define SVGA640x480x256     2   /* 640x480x256 Svga/VESA */ #define SVGA800x600x256     3   /* 800x600x256 Svga/VESA */ #define SVGA1024x768x256    4   /* 1024x768x256 Svga/VESA */  #ifndef XNOR_PUT #define XNOR_PUT    5 #define NAND_PUT    6 #define NOR_PUT     7 #endif #define TRANS_COPY_PUT  8  /* Setvgapalette256 sets the entire 256 color palette */ /* PalBuf contains RGB values for all 256 colors      */ /* R,G,B values range from 0 to 63                */ /* Usage:                         */ /*  DacPalette256 dac256;                 */ /*                            */ /* setvgapalette256(&dac256);                 */ void setvgapalette256(DacPalette256 *PalBuf) {   struct REGPACK reg;    reg.r_ax = 0x1012;   reg.r_bx = 0;   reg.r_cx = 256;   reg.r_es = FP_SEG(PalBuf);   reg.r_dx = FP_OFF(PalBuf);   intr(0x10,®); }  256_test.c #include "graphics.h" #include "svga256.h" #include "stdio.h" #include "fcntl.h" #include "malloc.h" #include "io.h"  int huge Return_SVGA256(void) {   return(SVGA1024x768x256); /* 返回各种分辨率的对应编号 0～6 宏定义参见 Svga256.h */ }  int main(void) {   int width, height, i=DETECT, j=0, x0, y0, fp;   unsigned char fix, *buffer, pix24b[4];   DacPalette256 dac256;   installuserdriver("Svga256", Return_SVGA256); /* 对于svga256必需执行该函数以安装BGI驱动 */   initgraph(&i, &j, ""); /* 执行TC默认的BGI初始化函数 */    line(0,0,100,100);   getch();   if((fp = open("xy_256.bmp", O_RDONLY | O_BINARY)) == -1)   {     puts("Can't find file ""xy_256.bmp"".");     return 1;   }   lseek(fp, 18, SEEK_SET);   read(fp, &width, 4);   read(fp, &height, 4);   fix = (width % 4) ? (4 - width % 4) : 0;   x0 = (320 - width) / 2;   y0 = (200 - height) / 2;   lseek(fp, 54, SEEK_SET);   for(i = 0; i < 256; i++) /* 按照该图片的DAC色表设置色彩寄存器 */   {     read(fp, pix24b, 4); /* 读取DAC分量信息 */     /* 设置调色板 */     dac256[i][0] = pix24b[2] >> 2;     dac256[i][1] = pix24b[1] >> 2;     dac256[i][2] = pix24b[0] >> 2;   }   setvgapalette256(&dac256); /* 应用调色板, 定义参见 Svga256.h */   buffer = (unsigned char *)malloc(width);   for(j = height - 1; j >= 0; j--)   {     read(fp, buffer, width);     lseek(fp, fix, SEEK_CUR);     for(i = 0; i < width; i++)       putpixel(x0+i, y0+j, buffer[i]);   }   free(buffer);   close(fp);   getch();   closegraph();   return 0; }  2011-07-18  15:48             1,562 256_test.c 2003-05-21  19:20            39,478 xy_256.bmp 2002-10-18  00:23             1,312 Svga256.h 2002-10-17  23:20             6,335 Svga256.bgi

user: user-1
content: 楼主说的是 “用纯C语言怎么写一个DOS界面显示图片” 而不是 “用C语言怎么写一个纯DOS界面显示图片”

user: user-10
content: 引用 7 楼 zhao4zhong1 的回复:#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <conio.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     SetTextColor(hdc,RGB(255,255,255));     SetBkMode(hdc,TRANSPARENT);     TextOut(hdc,210,30,"这个背景是泡泡",14);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }  你这个不算！要在实模式下实现DOS窗口显示图片，而不是保护模式，这个顶多算“投机取巧”！

user: user-11
content: 太高级...