我已经知道了RGB值,如何构造bitmap,并存成文件?我已经得到了一幅128*128大小的图像的所有象素点的RGB值,但它们分别是存储在三个128*128=16384大小的字节数组里面的,即band_R[16384],band_G[16384]和band_B[16384]。请问:我如何才能在vc下面将这幅图像重建出来,并以bmp文件格式存储在磁盘上?之前我是在.net下面实现了这个功能,真是无比的简单,但现在要将其移植到vc6下面,就力不从心了,还请大家帮忙! 急!o .我通常用的是申请内存。然后写BITMAPFILEHEADER,INFOHEADER,PIXELDATA,但是这样比较麻烦。。看看大家有什么好办法。多谢二楼! 能不能详细说说怎么写PIXELDATA呢? 最关心这个灰度图:一个字节表示一个点的灰度24真彩:b\g\r 3个字节表示。但是一行bmp的总字节数要被4整除。哦,不能被4整除要填0补充同上。多谢多谢~~ 可是我看到似乎有好几个函数可以用:SetDIBits,SetBitmapBits,SetPixel,SetPixelV,有的是API,有的是MFC里面的,看的我晕乎乎的,因为.net里面一个SetPixel就可以了,二位大虾能不能再指点一下?用GDI API或者MFC实现都可以,当然效率越高越好~createDIBSection()createDIBSection之后呢? 再给点提示吧,万分感谢~~这个我有源码。如果楼主现在还没有解决,就联系我,qq:5855474晚上在不过。。。。。我的是vb6的源码。楼主要要再联系吧。看你需要存储的bmp的格式如何,如果是24位的格式就很方便了,只要填好了BITMAPFILEHEADER , BITMAPINFOHEADER,按顺序填写近文件就可以了(最后填写你的数据)。vc6下便可以用gdi ,不过你要安装个sdk,转化就是两三个语句吧,网上有的,你查查看好感动,很久没有问个问题有那么多热心人回了 T_T感谢楼上几位。to Summer006:暂时还是需要vc的实现方案,不过如果方便的话,可以把你的vb源码发到
[email protected]里面,小弟想看看能不能得到点启发,谢啦:)to dirdirdir3你的名字真好打:) 我原来把手往键盘上一放就习惯性的想按dir,呵呵。我要重建的bmp图像每个象素的颜色信息就来自于那三个字节数组,应该就是3*8=24位的吧,那我应该怎么写数据呢?for i = 0 to 16383 写入文件(filename, band_R[i], band_G[i], band_B[i]);这样写吗?上面这句伪码写的比较垃圾,请多原谅~~ 写入文件的函数应该用SetDIBits,SetBitmapBits,SetPixel,SetPixelV里面的哪一个呢?谢谢~~to liu_aqvc下面可以用gdi 吗?要是和.net下面一样的处理方法那就太方便了,我找找看吧,谢啦band_R[16384],band_G[16384]和band_B[16384]。BYTE * m_data;for(int i=0;i<16384;i ){m_data = (BYTE *)new BYTE[width*height*3]; m_data=band_R[i]; m_data ; m_data=band_G[i]; m_data ; m_data=band_B[i]; m_data ;}short res1=0; short res2=0; long pixoff=54; long compression=0; long cmpsize=0; long colors=0; long impcol=0;char m1='B';char m2='M';m_errorText="OK";DWORD widthDW = WIDTHBYTES(width * 24);long bmfsize=sizeof(BITMAPFILEHEADER) sizeof(BITMAPINFOHEADER) widthDW * height;long byteswritten=0;BITMAPINFOHEADER header; header.biSize=40; // header sizeheader.biWidth=width;header.biHeight=height;header.biPlanes=1;header.biBitCount=24;// RGB encoded, 24 bitheader.biCompression=BI_RGB;// no compressionheader.biSizeImage=0;header.biXPelsPerMeter=0;header.biYPelsPerMeter=0;header.biClrUsed=0;header.biClrImportant=0;FILE *fp;fp=fopen(fileName,"wb");if (fp==NULL) {m_errorText="Can't open file for writing";return;}// should probably check for write errors here...fwrite((BYTE *)&(m1),1,1,fp); byteswritten =1;fwrite((BYTE *)&(m2),1,1,fp); byteswritten =1;fwrite((long *)&(bmfsize),4,1,fp);byteswritten =4;fwrite((int *)&(res1),2,1,fp); byteswritten =2;fwrite((int *)&(res2),2,1,fp); byteswritten =2;fwrite((long *)&(pixoff),4,1,fp); byteswritten =4;fwrite((BITMAPINFOHEADER *)&header,sizeof(BITMAPINFOHEADER),1,fp);byteswritten =sizeof(BITMAPINFOHEADER);long row=0;long rowidx;long row_size;row_size=header.biWidth*3; long rc;for (row=0;row<header.biHeight;row ) {rowidx=(long unsigned)row*row_size; // write a rowrc=fwrite((void *)(buf rowidx),row_size,1,fp);if (rc!=1) {m_errorText="fwrite errorGiving up";break;}byteswritten =row_size;// pad to DWORDfor (DWORD count=row_size;count<widthDW;count ) {char dummy=0;fwrite(&dummy,1,1,fp);byteswritten ; }这样应该可以了!哎呀,多谢楼上~~明天上班去试试,OK了,明晚回来结帖。不过说心里话我还是很喜欢GDI 里面的那个SetPixel和Save...,唉,高层的技术让人变懒了……