2010-12-16 29 views
2

我將我的代碼的輸出XImage轉換爲位圖,但輸出文件是巨大的,所以我想使用lzrw來壓縮它 我使用此代碼寫入位圖到文件寫入位圖字符串內置文件*或XImage到PNG

fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp); 
fwrite(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp); 
fwrite(pImage->data, 4*pImage->width*pImage->height, 1, fp); 

有反正我可以寫爲(字符*)insted的(FILE *),所以我可以用它lzrw壓縮? 甚至更​​好,有些方法直接將XImage轉換成PNG ...

謝謝;使用

+0

我想imlib2。 – 2010-12-16 16:33:11

回答

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); 

編輯:我更新的代碼,thaks @bdk您指出

+0

是的,當然。我會更新代碼 – DReJ 2010-12-16 16:32:43

+0

謝謝,生病嘗試 – killercode 2010-12-16 17:02:10

+0

沒有工作:S,如果我試圖保存tmp文件它不工作! – killercode 2010-12-16 18:53:46

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); 
} 
+0

似乎很棒,但我不知道如何使用這個庫保存XImage,我檢查了樣本,沒有人會顯示如何做我需要的:(... – killercode 2010-12-16 17:01:33

+0

@killercode:相關示例是C++示例中的示例3,btw。 – 2010-12-16 17:12:23

+0

圖像數據這是一種XImage結構?,這是將XImage轉換成PNG還是將位圖轉換爲PNG的方式? – killercode 2010-12-16 17:34:10