我将我的代码的输出XImage转换为Bitmap,但输出文件很大,所以我想用lzrw压缩它 我使用此代码将位图写入文件
fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
fwrite(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp);
fwrite(pImage->data, 4*pImage->width*pImage->height, 1, fp);
无论如何我可以将它写入(FILE *)的(char *),所以我可以使用lzrw压缩吗? 甚至更好,某种方式将XImage直接转换为PNG ......
感谢;
答案 0 :(得分:1)
使用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);
编辑:我更新了代码,感谢@bdk指出
答案 1 :(得分:0)
对于内存中的副本,请使用memcpy
作为DReJ说,但是如果你想将图像保存为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);
}