简体   繁体   中英

Raw RGB values to JPEG

I have an array with raw RGB values in it, and I need to write these values to a JPEG file. Is there an easy way to do this?

在此处输入图片说明

I tried:

std::ofstream ofs("./image.JPG", std::ios::out | std::ios::binary);

for (unsigned i = 0; i < width * height; ++i) {
   ofs << (int)(std::min(1.0f, image[i].x) * 255) << (int)(std::min(1.0f, image[i].y) * 255) << (int)(std::min(1.0f, image[i].z) * 255);
}

but the format isn't recognized.

If you're trying to produce an image file you might look at Netpbm . You could write the intermediate format (PBM or PAM) fairly simply from what you have. There are then a large number of already written programs that will generate many types of images from your intermediate file.

WOH THERE!

JPEG is MUCH more complicated than raw RBG values. You are going to need to use a library, like LIBJPEG, to store the data as JPEG.

If you wrote it yourself you'd have to:

  1. Convert from RGB to YCbCr
  2. Sample the image
  3. Divide into 8x8 blocks.
  4. Perform the DCT on each block.
  5. Run-length/huffman encode the values
  6. Write these values in properly formatted JPEG blocks.

You could use Boost GIL : it's free, portable (it's part of Boost libraries), usable across a broad spectrum of operating systems (including Windows).

Popular Linux and Unix distributions such as Fedora, Debian and NetBSD include pre-built Boost packages.

The code is quite simple:

#include <boost/gil/extension/io/jpeg_io.hpp>

const unsigned width  = 320;
const unsigned height = 200;

// Raw data.
unsigned char r[width * height];  // red
unsigned char g[width * height];  // green
unsigned char b[width * height];  // blue

int main()
{
  boost::gil::rgb8c_planar_view_t view =
    boost::gil::planar_rgb_view(width, height, r, g, b, width);

  boost::gil::jpeg_write_view("out.jpg", view);

  return 0;
}

jpeg_write_view saves the currently instantiated view to a jpeg file specified by the name (throws std::ios_base::failure if it fails to create the file).

Remember to link your program with -ljpeg .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM