我将我的代码的输出XImage转换为位图,但输出文件是巨大的,所以我想使用lzrw压缩它我使用此代码写入位图文件
fwrite(&bmpFileHeader,sizeof(bmpFileHeader),1,fp); fwrite(&bmpInfoHeader,sizeof(bmpInfoHeader),fp); fwrite(pImage->data,4*pImage->width*pImage->height,fp);
有反正我可以把它写入(char *)insted(FILE *),所以我可以使用lzrw压缩? 或者甚至更好,一些方法来将XImage直接转换为PNG …
谢谢;
为什么用这种方式计算位图大小?
Windows成像组件 – Direct2D C ++ – 绘图,保存
有没有办法使用本机C ++从WPF窗口捕获位图?
使用mfc / win32将我的程序自己的一部分窗口保存到位图文件中
如何在GDI中翻译一个简单的位图
DirectShow – 获取video帧
如何使用win32 API将位图复制到剪贴板?
Windows上的C ++中的位图操作
如何获取窗口的位图对象在C + +的屏幕截图?
使用memcpy而不是fwrite
char* tmp = buf; memcpy(tmp,&bmpFileHeader,sizeof(bmpFileHeader)); tmp += sizeof(bmpFileHeader); memcpy(tmp,&bmpInfoHeader,sizeof(bmpInfoHeader)); tmp += sizeof(bmpInfoHeader); memcpy(tmp,pImage->data,4*pImage->width*pImage->height);
编辑:我更新代码,thaks @bdk指出
对于内存拷贝来说,像DReJ说的那样使用memcpy ,但是如果你想把一个图像保存为PNG的话,你可能会比寻找一个像LodePNG这样简单的PNG库更糟糕:
http://members.gamedev.net/lode/projects/LodePNG/
如果有一个简单的选择,我不会浪费时间重新做自己的压缩方面 – 还有更重要的问题可以处理。
编辑 – 为了什么是值得的,我使用LodePNG保存PNG的代码如下所示:
void PNGSaver::save_image24(const std::string& filename,const Image24_CPtr& image) { std::vector<unsigned char> buffer; encode_png(image,buffer); LodePNG::saveFile(buffer,filename); } void PNGSaver::encode_png(const Image24_CPtr& image,std::vector<unsigned char>& buffer) { int width = image->width(); int height = image->height(); const int pixelCount = width*height; // Construct the image data array. std::vector<unsigned char> data(pixelCount*4); unsigned char *p = &data[0]; for(int y=0; y<height; ++y) for(int x=0; x<width; ++x) { Pixel24 pixel = (*image)(x,y); *p = pixel.r(); *(p+1) = pixel.g(); *(p+2) = pixel.b(); *(p+3) = 255; p += 4; } // Encode the PNG. LodePNG::encode(buffer,&data[0],width,height); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。