如何将.bmp格式的位图导入到tubor c编的c语言程序中
如何将.bmp格式的位图导入到tubor c编的c语言程序中???
希望看到的大神能够给出比较详细的解答,请不要问在下为啥还用这么落后的编辑器,这也是没办法的事情。能够推荐一些相关的资料也行,因为这类的资料现在真的是不好找。
[解决办法]
1)位图的头里是对位图的说明,可以参考windows使用的结构体,直接拷贝也行。
2)当做普通文件读入,得到头的信息,找到图像类容的偏移,存入数组。一般如果bitcount小于24的话图像类容存的是调色板的索引,24位的话就是直接的RGB数据。
3)建议LZ直接做一个相关的库。
[解决办法]
- C/C++ code
//MAIN FILE#include<iostream.h>#include<graphics.h>#include<fstream.h>#include "bitmap.h"// This Global Function is used for the resolution of the bitmap. You can set the return value either 1,2 or 3. For me 3 is the best combination.huge DetectSvga(){ return 3;}void main(){ int gd = DETECT, md, a; installuserdriver("SVGA256",&DetectSvga); initgraph(&gd,&md,"c:\\tc\\bgi"); //Path may be different in your computer. Show(); Show1(); }//Suppose you have one show function which read the bitmap from the disk. Then this show function looks like this.void Show(){ fstream File; //Here you have to define the path of the bitmap file. Like according to this example i have to open one Board1.bmp file. So write you bitmap file path here. File.open("d:\\Chess\\Bitmaps\\Board1.bmp",ios::in); unsigned char Ch; File.read((char*)&HEADER,14); //This is the header part of the Bitmap. It always looks like same. Don't change the content hear. The value remains 14 here. File.read((char*)&INFOHEADER,40); //This is another part of the bitmap, here also the value remains same like 40 here. unsigned int i; char ColorBytes[4]; char*PaletteData; PaletteData=new char[256*3]; if(PaletteData)//if memory allocated successfully { //read color data for(i=0;i<256;i++) { //Don't change the code here because i have done some shifting here. Its working fine. File.read(ColorBytes,4); PaletteData[(int)(i*3+2)]=ColorBytes[0]>>2; PaletteData[(int)(i*3+1)]=ColorBytes[1]>>2; PaletteData[(int)(i*3+0)]=ColorBytes[2]>>2; } outp(0x03c8,0); //tell DAC that data is coming for(i=0;i<256*3;i++) //send data to SVGA DAC { outp(0x03c9,PaletteData[i]); } delete[]PaletteData; } for(i=0;i<INFOHEADER.height;i++) //This for loop is used to display the bitmap. { for(int j=0;j<INFOHEADER.width;) { File.read(&Ch,1); // Here Ch reads the color of your bitmap. putpixel(XCor+j++,YCor+INFOHEADER.height-i-1,Ch); //XCor and YCor are the X and Y cordinates. It depends upon you. } } File.close(); }//Another way to display the Bitmap is. Suppose i have another Show1() Function. This is simple as compare to previous show function.void Show1(){ Char Ch; fstream File; File.open("d:\\Chess\\Bitmaps\\KingA.bmp",ios::in); File.seekg(54,ios::beg); //Its remains same. Means value always remains 54 File.seekg(256*4,ios::cur); //Its remains same means value always remain 256*4. for(int i=0;i<40;i++) //Here 40 shows the height of the bitmap. It may be differ it depends upon the size of your bitmap. { for(int j=0;j<36;j++) //Here 36 shows the width of the bitmap. It may be differ it depends upon the size of your bitmap. { File.read(&Ch,1); //Here Ch is the character which reads the color of your bitmap. putpixel(this->XCor+j,this->YCor+39-i ,Ch); } } }
[解决办法]
http://www.easyx.cn
------解决方案--------------------
freeimage