Note that there are some explanatory texts on larger screens.

plurals
  1. PORGB buffer to JPEG buffer, what is wrong here?
    primarykey
    data
    text
    <p>I need an easy way to convert an buffer containing RGB data into a jpeg. I already tried using libjpeg, but I simply cannot get it to work right. For example, while saving the buffer as a Bitmap produces this:</p> <p><img src="https://i.stack.imgur.com/eVFHx.png" alt="Bitmap Screenshot"></p> <p>Using libjpeg to encode the same image in memory produces this:</p> <p><img src="https://i.stack.imgur.com/QccLg.jpg" alt="enter image description here"></p> <p>And saving the image directly to a file just aborts without giving a warning, error or anything.</p> <p>I certainly need something that works!</p> <p>This is what I am doing</p> <pre><code>void OnKeyPress(unsigned char key, int x, int y) { if (key != static_cast&lt;unsigned char&gt;('p')) return; int width = g_current_width; int height = g_current_height; boost::scoped_array&lt;boost::uint8_t&gt; buffer(new boost::uint8_t[3 * width * height]); glReadBuffer(GL_FRONT); glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, reinterpret_cast&lt;GLvoid *&gt;(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(&amp;jerr); jerr.trace_level = 10; jpeg_create_compress(&amp;cinfo); boost::uint8_t *jpeg_buffer_raw = NULL; unsigned long outbuffer_size = 0; jpeg_mem_dest(&amp;cinfo, &amp;jpeg_buffer_raw, &amp;outbuffer_size); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&amp;cinfo); jpeg_set_quality(&amp;cinfo, 100, true); jpeg_start_compress(&amp;cinfo, true); int row_stride = width * 3; JSAMPROW row_pointer[1]; int counter = 0; std::cout &lt;&lt; boost::format("height: %d\n") % height; boost::uint8_t *r_buffer = buffer.get(); while (cinfo.next_scanline &lt; cinfo.image_height) { row_pointer[0] = &amp;r_buffer[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&amp;cinfo, row_pointer, 1); std::cout &lt;&lt; boost::format("current line: %d\n") % (counter++); } jpeg_finish_compress(&amp;cinfo); jpeg_destroy_compress(&amp;cinfo); std::ofstream jpegfile("screenshot.jpg"); jpegfile.write(reinterpret_cast&lt;const char*&gt;(jpeg_buffer_raw), outbuffer_size); jpegfile.flush(); // calling free(jpeg_buffer_raw); or delete[] jpeg_buffer_raw; generates an error } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload