PDA

View Full Version : فايل bmp



queen-mm
دوشنبه 04 آبان 1388, 22:54 عصر
ممكنه درباره ي فايل هاي bmp ونحوه ي كار با اونها توي c++كمي توضيح بدين؟

pswin.pooya
دوشنبه 04 آبان 1388, 23:06 عصر
این فایها 6 بایت هدر دارن و بفیه فایلها داده در قلب خام بدون فشرده سازی هستش. اما توی بعضی از حالتها امکان داره داده پک بشه. پیشنهاد میشه از یه کتابخونه مثل devil برای کار با اونها ( باز کردن و دخیره کردن) استفاده بکنین. این کتابخونه فرمتهای بسیار زیادی رو پشتیبانی میکنه.

tdkhakpur
سه شنبه 05 آبان 1388, 00:39 صبح
هدر فايل بيشتر از 6 بايت بايد باشد و همچنين داده هايي ديگري مانند پالت و اندازه و ورژن داخل هدر وجود دارد
برنامه زير براي داس طراحي شده ميتوان آنرا براي ويندوز هم تغيير جهت داد.


#include <stdio.h>
#include <graphics.h>
#include <dos.h>
#include <stdlib.h>
void showBmp(int x,int y,char *fname){
int PalTable[16] =
{0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63};
FILE *fp;
unsigned char i,j,m,n,o , a[220];
unsigned int t1,t2,xlen,ylen;
char Pal[16][3];
if( (fp= fopen(fname,"rb"))== NULL)
exit(0);
rewind(fp);
fseek(fp,18L,SEEK_SET);
j=fgetc(fp);
i=fgetc(fp);
xlen=(j)+(i) *256;
fseek(fp,22L,SEEK_SET);
j=fgetc(fp);
i=fgetc(fp);;
ylen=(int)(j+i*256);

if ((xlen % 8 )!= 0) xlen=xlen+8-xlen % 8 ;
fseek(fp,54L,SEEK_SET);
for (t1=0 ; t1<16;t1++)
{
m=fgetc(fp);
n=fgetc(fp);
o=fgetc(fp);
i=fgetc(fp);
Pal[t1][0]=m / 4;Pal[t1][1]=n / 4;
Pal[t1][2]=o /4;
}
for (t1=0 ; t1<16;t1++)
setrgbpalette(PalTable[t1], Pal[t1][2],Pal[t1][1],Pal[t1][0]);
fseek(fp,118L,SEEK_SET);
t2=y ;
for(t2=0; t2<ylen; ++t2)
{
fread( a , 1 , 204 , fp );
for (t1=0 ;t1< (xlen / 2);t1++)
{
m=inport(0x60) ;
if(m==1)
{
fclose(fp) ;
return ;
}
putpixel((x+2*t1) ,y, (a[t1] / 16) );
putpixel((x+2*t1)+1,y, (a[t1] % 16) );
}
y--;
}
fclose(fp) ;
}
//================================================== =======================
void main(void)
{
int gdriver = VGA, gmode = VGAHI, errorcode,ret,repeat,lens,nextx,nexty ,i;
struct palettetype pal;
initgraph(&gdriver, &gmode, "g:\\borlandc\\bgi") ;
showBmp(1,1,"pic.bmp") ;
scanf("%c");
closegraph() ;
}

queen-mm
چهارشنبه 06 آبان 1388, 13:45 عصر
ببخشيد اين كدتون اررور مي ده:
error BGI graphics not supported under Windows

من چيه اين كد رو عوض كنم تا تحت ويندوز كار كنه؟مي شه يه كم درباره ي اين كد توضيح بدين؟

pswin.pooya
پنج شنبه 07 آبان 1388, 01:33 صبح
ببخشيد اين كدتون اررور مي ده:
error BGI graphics not supported under Windows

من چيه اين كد رو عوض كنم تا تحت ويندوز كار كنه؟مي شه يه كم درباره ي اين كد توضيح بدين؟

برای اینکار باید هدر graphics و دستورهای مربوط به اون مثل putpixel رو باید حدف کنی.

برای رسم داخل ویندوز به تاپیک زیر مراجعه کن:
http://barnamenevis.org/forum/showthread.php?t=103584

برای لود کردن بی درد سر فایهای گرافیکی هم از devil استفاده کن (همه فرمتهای معروف مثل png، jpeg، bmp,tif,tga و ... رو هم برای ذخیره و هم برای لود پشتیبانی میکنه. )
http://openil.sourceforge.net/

queen-mm
پنج شنبه 07 آبان 1388, 10:22 صبح
ببخشيد ولي من خيلي غير حرفه اي هستم مي شه بيشتر توضيح بدين؟اين تاپيك رو هم قبلا مطالعه كردم.

pswin.pooya
جمعه 08 آبان 1388, 19:37 عصر
ببخشيد ولي من خيلي غير حرفه اي هستم مي شه بيشتر توضيح بدين؟اين تاپيك رو هم قبلا مطالعه كردم.

نحوه کار با Devil ( OpenIL):

اول از همه باید devil رو مقدار دهی اولیه بکنید برای اینکار کافیه که کد زیر رو تایپ کنید:



// initializing DevIL
ilInit ();
ilEnable (IL_CONV_PAL);

بعدش میتونی از دستوراتش برای بارگذاری تصویر استفاده کنی:

unsigned int ImgId;
ilGenImages (1, &ImgId);
ilEnable(IL_ORIGIN_SET );
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
// Loads the image specified by File into the ImgId image.
if (!ilLoadImage (filename)

{
cout << "Error, can not load: " <<filename << endl;
return ;
}
ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE);

int height = ilGetInteger(IL_IMAGE_HEIGHT);
int width = ilGetInteger(IL_IMAGE_WIDTH);
char* data = (char*)ilGetData();


کافیه که به جای filename اسم فایل رو بذاری. اشاره گر دیتا به محتویات فایلت اشاره می کنه و width و height هم به ترتیب برابر طول و عرض فایل میشن. هر کامپوننت رنگ یک بایت اشفال میکنه یعنی هر پیکسل چهار بایت. و قالب داده هم RGBA میشه.