| 发表于:2007-03-21 20:40:572楼 得分:0 |
ool zimage::win::savedctobmpstream(hdc hdc,const cimgrect& saverect,bool bvertinvert,ude::istream* pstream) { zimg_assert(pstream!=null); bool bret=false; if(hdc!=null){ bitmapinfoheader bmpi; zeromemory(&bmpi,sizeof(bitmapinfoheader)); bmpi.biheight=saverect.height(); bmpi.biwidth=saverect.width(); bmpi.bibitcount=24; bmpi.bicompression=bi_rgb; bmpi.bisize=sizeof(bmpi); bmpi.biplanes=1; dword* pbits=null; hbitmap hbmp=createdibsection(hdc,(const bitmapinfo*)&bmpi,dib_rgb_colors, (lpvoid*)&pbits,null,0); if(hbmp!=null){ hdc htmpdc=::createcompatibledc(null); hgdiobj holdobj=selectobject(htmpdc,hbmp); bitblt(htmpdc,0,0,saverect.width(),saverect.height(),hdc,saverect.left,saverect.top,srccopy); bitmapfileheader bmpfh; zeromemory(&bmpfh,sizeof(bitmapfileheader)); bmpfh.bftype=0x4d42; bmpfh.bfoffbits=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader); bmpfh.bfsize=sizeof(bitmapfileheader)+sizeof(bitmapinfoheader); pstream-> write(&bmpfh,sizeof(bitmapfileheader)); if(!bvertinvert) bmpi.biheight=-bmpi.biheight; pstream-> write(&bmpi,sizeof(bitmapinfoheader)); byte* pbbytes=(byte*)pbits; size_type nrowsize=bmpi.biwidth*3; size_type nalignrowbytesize=nrowsize+((bitsperbyte*nwinbmprowalignment)-1)/bitsperbyte; for(size_type i=0;i <(size_type)saverect.height();i++){ pstream-> write(pbbytes+nalignrowbytesize*i,nalignrowbytesize); } //invert write failed on final output,why? //for(size_type i=0;i <(size_type)saverect.height();i++){ // pstream-> write(pbbytes+nalignrowbytesize*(saverect.height()-i-1),nalignrowbytesize); //} bret=true; } deleteobject(hbmp); } return bret; } | | |
|