2012-05-07 20 views
2

RGBデータを含むバッファをjpegに簡単に変換する必要があります。私はすでにlibjpegを使ってみましたが、正しく動作させることはできません。にRGBバッファからJPEGバッファへ、何が間違っていますか?

enter image description here

直接画像を保存:メモリ内の同じ画像を符号化するためのlibjpegを使用

Bitmap Screenshot

この生成たとえば、バッファを保存しているとき、ビットマップは、この生成したようにファイルは警告、エラー、または何も与えずにただ終了します。

私は確かに動作するものが必要です!

これは私がそう

void OnKeyPress(unsigned char key, int x, int y) { 
    if (key != static_cast<unsigned char>('p')) 
    return; 

    int width = g_current_width; 
    int height = g_current_height; 
    boost::scoped_array<boost::uint8_t> buffer(new boost::uint8_t[3 * width * height]); 

    glReadBuffer(GL_FRONT); 
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, 
       reinterpret_cast<GLvoid *>(buffer.get())); 
    glReadBuffer(GL_BACK); 

    FlipImage(buffer.get(), width, height); 

    // Generate a BMP files for testing purposes 
    SaveRGB("screenshot.bmp", buffer.get(), width, height); 

    jpeg_compress_struct cinfo; 
    jpeg_error_mgr jerr; 
    cinfo.err = jpeg_std_error(&jerr); 
    jerr.trace_level = 10; 
    jpeg_create_compress(&cinfo); 
    boost::uint8_t *jpeg_buffer_raw = NULL; 
    unsigned long outbuffer_size = 0; 
    jpeg_mem_dest(&cinfo, &jpeg_buffer_raw, &outbuffer_size); 

    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, 100, true); 
    jpeg_start_compress(&cinfo, true); 
    int row_stride = width * 3; 
    JSAMPROW row_pointer[1]; 
    int counter = 0; 
    std::cout << boost::format("height: %d\n") % height; 
    boost::uint8_t *r_buffer = buffer.get(); 
    while (cinfo.next_scanline < cinfo.image_height) { 
    row_pointer[0] = &r_buffer[cinfo.next_scanline * row_stride]; 
    jpeg_write_scanlines(&cinfo, row_pointer, 1); 
    std::cout << boost::format("current line: %d\n") % (counter++); 
    } 
    jpeg_finish_compress(&cinfo); 
    jpeg_destroy_compress(&cinfo); 
    std::ofstream jpegfile("screenshot.jpg"); 
    jpegfile.write(reinterpret_cast<const char*>(jpeg_buffer_raw), outbuffer_size); 
    jpegfile.flush(); 
    // calling free(jpeg_buffer_raw); or delete[] jpeg_buffer_raw; generates an error 
} 
+3

する方法あなたはlibjpegを呼びますか?コードを私たちに教えてください。 – Thomas

+1

SOはQ&Aサイトです。あなたの質問は何ですか? –

+0

皆さん、私はコードを使用して質問を更新します。 – Sambatyon

答えて

2

をやって何ですが、私は問題を発見し、それが一番最後に、出力ファイルは次のように初期化されている必要がありました。

std::ofstream jpegfile("screenshot.jpg", std::ios_base::out | std::ios_base::binary); 
関連する問題