?? dos 16位色.cpp
字號:
/***********************************************
*******在DOS下顯示16位色位圖源程序**************
***********************************************/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <fcntl.h>
#include <bios.h>
#include <dos.h>
#include <io.h>
#include <graphics.h>
#define closegr closegraph
/***********************************************
*************位圖文件頭結構*********************
***********************************************/
typedef struct
{
int id; /*兩字節的內容用來識別位圖的類型:
'BM' : Windows 3.1x, 95, NT, …
'BA' :OS/2 Bitmap Array
'CI' :OS/2 Color Icon
'CP' :OS/2 Color Pointer
'IC' : OS/2 Icon
'PT' :OS/2 Pointer
注:因為OS/2系統并沒有被普及開,所以在編程時,你只需判斷第一個標識"BM"就行
*/
long filesize; /*用字節表示的整個文件的大小*/
long reserved; /*保留,必須設置為0*/
long dataoffset; /*從文件開始到位圖數據開始之間的數據(bitmap data)之間的偏移量*/
long headersize; /*位圖信息頭(Bitmap Info Header)的長度,用來描述位圖的顏色、壓縮方法等。下面的長度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系統中,位圖信息頭的長度并不一定是28h,因為微軟已經制定出了新的BMP文件格式,其中的信息頭結構變化比較大,長度加長。所以最好不要直接使用常數28h,而是應該從具體的文件中讀取這個值。這樣才能確保程序的兼容性。
*/
long width; /*位圖的寬度,以象素為單位*/
long height;/*位圖的高度,以象素為單位*/
int Planes; /*位圖的位面數(注:該值將總是1)*/
int Pixe; /*每個象素的位數
1 - 單色位圖(實際上可有兩種顏色,缺省情況下是黑色和白色。你可以自己定義這兩種顏色)
4 - 16 色位圖
8 - 256 色位圖
16 - 16bit 高彩色位圖
24 - 24bit 真彩色位圖
32 - 32bit 增強型真彩色位圖
*/
long Compression; /*壓縮說明:
0 - 不壓縮 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
*/
long bmpDataSize; /*用字節數表示的位圖數據的大小。該數必須是4的倍數*/
long XPelsPerMeter;/*用象素/米表示的水平分辨率*/
long YPelsPerMeter;/*用象素/米表示的垂直分辨率*/
long ClrUsed; /*位圖使用的顏色數。如8-比特/象素表示為100h或者 256*/
long ClrImportant; /*指定重要的顏色數。當該域的值等于顏色數時(或者等于0時),表示所有顏色都一樣重要*/
}BMPHEAD;
BMPHEAD BmpHead;
char convert[16] = {0x0,0x4,0x2,0x6,0x1,0x5,0x3,0x7,0x8,0xc,0xa,0xe,0x9,0xd,0x3,0xf};/*BMP色彩與VGA色對照表*/
unsigned char * bmp_data;
int fp;
/**********************************************
************ BGI初始化函數*********************
**********************************************/
void initgr(void)
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */
registerbgidriver(EGAVGA_driver);/* 注冊BGI驅動后可以不需要.BGI文件的支持運行 */
initgraph(&gd, &gm, "");
}
/***********************************************
*************位圖文件頭讀取函數*****************
***********************************************/
int read_bmp_head(char *bmp_filename)
{
if((fp=open(bmp_filename,O_RDONLY))==-1)/*打開位圖文件*/
{
printf("%s%s",bmp_filename," is not found.");
return 1;
}
read(fp,&BmpHead,sizeof(BMPHEAD));/*讀取BMP文件的信息頭*/
if(BmpHead.id!=0x4d42) /*判斷是否是BMP文件*/
{
printf("%s%s","'",bmp_filename,"' is not BMPfile");
return 1;
}
return 0;
}
/***********************************************
**************糾正寬度函數**********************
***********************************************/
int correct_width(int width)
{
int factual_width;
if(width%4==0&&(width/4)%2==0);
else while(width%4!=0||(width/4)%2!=0)width++;
factual_width=width;
return factual_width;
}
/***********************************************
*************讀位圖文件并顯示函數***************
***********************************************/
void put_bmp(char * bmpfile,int x,int y)
{
int read_bmp_head_return,i,j,d=0,cn;
bmp_data=(unsigned char *)malloc(BmpHead.bmpDataSize*sizeof(unsigned char));
if((read_bmp_head_return=read_bmp_head(bmpfile))==1)
{
getch();
exit(1);
}
lseek(fp,BmpHead.dataoffset,SEEK_SET);
read(fp,bmp_data,BmpHead.bmpDataSize);/*讀取顏色數據到緩沖區內*/
cn=correct_width(BmpHead.width);
for(i=BmpHead.height;i>0;i--)
for(j=0;j<cn;)
{
putpixel(x+j++,y+i,convert[bmp_data[d]>>4]);/*用高4位畫1個點*/
putpixel(x+j++,y+i,convert[bmp_data[d]&0xf]); /*用低4位畫1個點*/
d++;
}
free(bmp_data);
close(fp);
}
/***********************************************
*************主函數*****************************
***********************************************/
int main(void)
{
initgr();
put_bmp("pix.bmp",320,240);
getch();
closegr();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -