#include"stdio.h"
#include"dir.h"
#include"dos.h"
#include "graphics.h"
char *malloc();/*malloc轉換*/
char bmp_to_dat(char *bmp,char *dat)/*將16色BMP檔案轉換為可以用putimage輸出的格式,bmp為原BMP檔案,dat為轉化檔案*/
{
unsigned char c[8],scan_times,scan_pixs;
unsigned char workpos;
int i,j,k,n,nowpos,iw,ih;
static int color[16]={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
unsigned char workline[640],scanline[640];
FILE *fp,*targetfp;
union {
unsigned char value;
struct{
unsigned cl:4;
unsigned ch:4;
}color;}mycolor;
if((fp=fopen(bmp,"rb"))==NULL)
return(0);
targetfp=fopen(dat,"wb");
fseek(fp,18,SEEK_SET);
iw=0;
ih=0;
fread(&iw,4,1,fp);/*讀影像寬度*/
fread(&ih,4,1,fp);/*讀影像高度*/
if(iw==0&&ih==0&&iw>640&&ih>480)
{
fclose(fp);
fclose(targetfp);
return(0);}
iw--;
ih--;/*∵putimage中的長寬比實際數值少1*/
scan_times=iw/8+1;
/*行處理單位數*/
scan_pixs=scan_times*4;/*行像素位元組數∵1單位=4位元組*/
fputc(iw%256,targetfp);/*填充資訊頭:長、寬部分*/
fputc(iw/256,targetfp);
fputc(ih%256,targetfp);
fputc(ih/256,targetfp);
fseek(fp,-scan_pixs,SEEK_END);
for(j=0;j<=ih;j++)
{nowpos=0;
fread(scanline,scan_pixs,1,fp);
fseek(fp,-scan_pixs*2,SEEK_CUR);
for(n=3;n>=0;n--)
/*解碼4個位面*/
{for(i=0;i<scan_times;i++)
/*解碼各編碼單位*/
{workpos=0;
for(k=0;k<4;k++)/*分離出8個像素*/
{mycolor.value=https://bbs.csdn.net/topics/scanline[i*4+k];
c[k*2]=color[mycolor.color.ch];
c[k*2+1]=color[mycolor.color.cl];}
for(k=0;k<8;k++)
workpos+=(c[k]>>n&1)<<(7-k);
workline[nowpos]=workpos;
nowpos++;}}
fwrite(workline,scan_pixs,1,targetfp);}
fclose(fp);
fclose(targetfp);
return(1);
}
void main()
{
int gd=VGA,gm=VGAHI,n;
char*buffer;
char _16file[20]={"c:\\tc\\bmp\\2.dat"};
char bmpfile[20]={"c:\\tc\\bmp\\2.bmp"};
FILE *fp;
struct ffblk ff;
initgraph(&gd,&gm,"c:\\tc\\BGI");
/*while(1)
{
n=getch();
switch(n)
{case 0 :continue;
case '0':exit(0);
case '1':strcpy(bmpfile,"1.bmp");
goto OUT;
case '2':strcpy(bmpfile,"2.bmp");//bmpfile是檔案名,可以理解為圖片名
goto OUT;
case '3':{
printf("Input filename(*.bmp):");
gets(bmpfile);
goto OUT;
}
}
}
OUT: strncpy(_16file,bmpfile,strlen(bmpfile)-3);
strcat(_16file,"dat");*/
if(!bmp_to_dat(bmpfile,_16file))
{
puts("File Error!");
closegraph();
exit(0);}
fp=fopen(_16file,"rb");
findfirst(_16file,&ff,FA_ARCH);
if((buffer=malloc(ff.ff_fsize))==NULL)
exit(0);
n=0;
while(!feof(fp))
{buffer[n]=fgetc(fp);
n++; }
for(n=0;n<100;n++)
{putimage(350-n,n/2,buffer,COPY_PUT); }
getch();
closegraph();
free(buffer);
fclose(fp); }
程式在這,編譯可以通過,但是會顯示黑屏,請各位大神指教
uj5u.com熱心網友回復:
16位編程環境最基本的意思是int是16位的。你的iw ih 都只有2位元組空間,你讀進來4位元組是要越界的。
影像長寬都錯了的情況下,其他不正常現象恐怕就正常了
所以,我承認只看了幾行,下面沒看。
uj5u.com熱心網友回復:
ih和iw不是int型別嗎uj5u.com熱心網友回復:
您這個我沒聽懂,我換了long也不行
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/268514.html
標籤:C語言
上一篇:C語言排序
