2016-11-10 5 views
1

私はanother answerを試してみましたが、この権利を得ることはできません。私はlibjpeg-turboを使ってメモリ内のjpegに変換するRBGXビットマップについて約8MiBを持っています。私がjpeg_stdio_destを使用すると、ファイルにすべてのことを書き込んだり、ファイルを読み込んだりすることができます。それは大丈夫です。しかし、jpeg_mem_destを使用しようとすると困惑しています。私はすべてjpeg_stdio_destと同じ設定をしていますが、memを使用すると、4KiBの割り当てが1つしかないように見えます。jpeg_mem_destを使用してlibjpeg-turboでメモリに圧縮する方法

jpeg_mem_destの使用方法に関する詳細な指示がありません。実際には方向性があります。

void compress(std::vector<unsigned char>& input) { 
    jpeg_compress_struct cinfo{}; 
    jpeg_error_mgr err{}; 

    cinfo.err = jpeg_std_error(&err); 
    jpeg_create_compress(&cinfo); 
#if 0 // using this with an open FILE* out works 
    jpeg_stdio_dest(&cinfo, out); 
#endif 


    cinfo.image_width = kWidth; // constants defined somewhere 
    cinfo.image_height = kHeight; 
    cinfo.input_components = 4; 
    cinfo.in_color_space = JCS_EXT_RGBX; 

    // what's wrong with this? 
    unsigned char* buf{}; 
    unsigned long buf_sz{}; 
    jpeg_mem_dest(&cinfo, &buf, &buf_sz); 

    jpeg_set_defaults(&cinfo); 
    jpeg_set_quality(&cinfo, 70, true); 

    jpeg_start_compress(&cinfo, true); 
    while (cinfo.next_scanline < cinfo.image_height) { 
    auto row = static_cast<JSAMPROW>(&input[cinfo.next_scanline * 4 * kWidth]); 
    jpeg_write_scanlines(&cinfo, &row, 1); 
    // Always prints 4096, and buf never changes 
    std::cout << "buf_sz: " << buf_sz 
       << " buf: " << static_cast<void*>(buf) << '\n'; 
    } 
    jpeg_finish_compress(&cinfo); 

    // ... 
    // in reality, return the compressed data 
} 

答えて

2

ええ、それはまったく直感的ではありません。 jpeg_mem_dest()の調整を提案したプログラマーはあまり選択肢がありませんでした。既存のAPIを拡張するのは、最初に機能をサポートするように設計されていないときは簡単ではありません。完全にわかりにくいのは、のjpeg_finish_compress()呼び出しの後に、変数がまで更新されないということです。ライブラリの関連コードは次のとおりです。

​​

単語「term」に注意してください。この関数は、関数ポインタを介して間接的に呼び出されます。

GLOBAL(void) 
jpeg_finish_compress (j_compress_ptr cinfo) 
{ 
    //... 
    /* Write EOI, do final cleanup */ 
    (*cinfo->marker->write_file_trailer) (cinfo); 
    (*cinfo->dest->term_destination) (cinfo); 
    //... 
} 

何もできません。あなたのstd :: coutコードを微調整するだけで、ループの後に移動して、ライブラリの動作を調整することができます。

この機能の他のぎりぎりの細かい点も注意してください。作成したバッファをfree()する必要があります。提供されたcjpeg.cサンプルプログラムで表示され、main()の終わりです。

関連する問題