void TImageWriterBmp::save(const TImageP &image) { TRasterImageP rasImage(image); TRaster32P ras32; ras32 = rasImage->getRaster(); TRasterGR8P ras8; ras8 = rasImage->getRaster(); void *buff = 0; int pixSize; if (!ras32 && !ras8)) throw TImageException(m_path, buildBMPExceptionString(UNSUPPORTED_BMP_FORMAT)); rasImage->getRaster()->lock(); if (ras32) { buff = ras32->getRawData(); m_lx = ras32->getLx(); m_ly = ras32->getLy(); pixSize = 32; } else { buff = ras8->getRawData(); m_lx = ras8->getLx(); m_ly = ras8->getLy(); pixSize = 8; } int retCode = writebmp(getFilePath().getWideString().c_str(), m_lx, m_ly, buff, pixSize); rasImage->getRaster()->unlock(); if (retCode != OK) { throw TImageException(m_path, buildBMPExceptionString(retCode)); } }
int writeimage(char * name, int xres, int yres, unsigned char *imgdata, int format) { if (imgdata == NULL) return IMAGENULLDATA; switch (format) { case RT_FORMAT_PPM: return writeppm(name, xres, yres, imgdata); case RT_FORMAT_SGIRGB: return writergb(name, xres, yres, imgdata); case RT_FORMAT_JPEG: return writejpeg(name, xres, yres, imgdata); case RT_FORMAT_PNG: return writepng(name, xres, yres, imgdata); case RT_FORMAT_WINBMP: return writebmp(name, xres, yres, imgdata); case RT_FORMAT_TARGA: default: return writetga(name, xres, yres, imgdata); } }
int main() { unsigned char * buf; buf = (unsigned char *)malloc(4000000); memset(buf,0,4000000); unsigned char * buf2; buf2 = (unsigned char *)malloc(4000000); memset(buf2,0,4000000); //overflows specifying too large palette writebmp("ok8bit.bmp",16,16,8,0,buf,256,buf,16*16); writebmp("paletteof1.bmp",16,16,8,0,buf,65535,buf,16*16); writebmp("paletteof2.bmp",16,16,8,0,buf,1000000,buf,16*16); //integer overflows with image dimensions writebmp("ok24bit.bmp",16,16,24,0,NULL,0,buf,16*16*4); writebmp("wh4intof.bmp",32769,32768,24,0,NULL,0,buf,4000000); writebmp("wh3intof.bmp",37838,37838,24,0,NULL,0,buf,4000000); writebmp("w4intof.bmp",1073741825,1,24,0,NULL,0,buf,4000000); writebmp("w3intof.bmp",1431655767,1,24,0,NULL,0,buf,4000000); //overflows with RLE encoded BMPs buf2[0]=16; buf2[1]=0; writebmp("okRLE.bmp",16,1,8,1,buf,256,buf2,2); for(long i=0;i<500000;i++) { buf2[i*2]=255; buf2[i*2+1]=0; } writebmp("rle8of1.bmp",16,1,8,1,buf,256,buf2,1000000); buf2[0]=15; buf2[1]=0; for(long i=1;i<500000;i++) { buf2[i*2]=255; buf2[i*2+1]=0; } writebmp("rle8of2.bmp",16,1,8,1,buf,256,buf2,1000000); memset(buf2,0,4000000); buf2[0]=0; buf2[1]=2; buf2[2]=255; buf2[3]=0; for(long i=4;i<100000-1;) { buf2[i]=0; buf2[i+1]=254; i+=255; } writebmp("rle8of3.bmp",16,1,8,1,buf,256,buf2,1000000); memset(buf2,0,4000000); for(long i=0;i<100000-1;) { buf2[i]=0; buf2[i+1]=254; i+=255; } writebmp("rle8of4.bmp",16,1,8,1,buf,256,buf2,1000000); }