2011-07-05 102 views

回答

0

我剛纔說的答案應該是使用libpng。然而在quick look at the documentation之後,我發現這種庫方式比所需要的複雜得多(容易的事情應該很容易,應該可能很難......在看完手冊之後,似乎用libpng簡單的事情幾乎是不可能的)。 PNG格式有gajillion選項,libpng是非常靈活和可插拔的,但顯然當你只是想做一些簡單的事情(比如保存一張不透明的圖像)時沒有簡單的捷徑。

我想我會試圖以原始格式轉儲圖像,然後使用imagemagick(可能通過管道)。

另一方面,你認爲使用Qt而不是裸X?捕獲屏幕很容易,你可以使用更易於管理的格式(QImage)。保存幾乎任何你喜歡的文件格式也是微不足道的(然而,在Qt中,png格式在CPU上有些困難,所以如果你想做一個實時視頻捕獲,不建議這麼做)。

+0

libpng可能會令人生畏,但爲簡單圖像創建編寫一些幫助程序/包裝應該不難:例如http://zarb.org/~gc/html/libpng.html – leonbloy

+1

@leonbloy:34非空非註釋行僅用於加載圖像並不令人感到恐懼。這很傻。在Qt中是'QImage img(filename);'。 – 6502

1

這裏是一個C函數​​數據轉換爲JPEG圖像:

void write_jpeg(FILE *outfile, int width, int height, unsigned char *rgb, int quality) 
{ 
    struct jpeg_compress_struct cinfo; 
    struct jpeg_error_mgr jerr; 
    JSAMPROW scanline[1]; 
    cinfo.err = jpeg_std_error(&jerr); 
    jpeg_create_compress(&cinfo); 
    jpeg_stdio_dest(&cinfo, outfile); 
    cinfo.image_width = width; 
    cinfo.image_height = height; 
    cinfo.input_components = 3; 
    cinfo.in_color_space = JCS_RGB; 
    jpeg_set_defaults(&cinfo); 
    jpeg_set_quality(&cinfo, quality, TRUE); 
    jpeg_start_compress(&cinfo, TRUE); 
    while (cinfo.next_scanline < (unsigned int) height) 
    { 
     scanline[0] = rgb + 3 * width * cinfo.next_scanline; 
     jpeg_write_scanlines(&cinfo, scanline, 1); 
    } 
    jpeg_finish_compress(&cinfo); 
    jpeg_destroy_compress(&cinfo); 
} 

我相信你可以很容易地融入你的代碼這一點。您只需使用適當的庫來保存PNG文件(而不是jpeg文件)。

相關問題