提取RGB从JPEG图像,使用libjepg
问题描述:
我使用的libjpeg库读取和一个JPEG复制到我写在C++提取RGB从JPEG图像,使用libjepg
我有一个显示缓冲器,其是被称为一个数据类型的一个矢量的编辑程序ColorData
所有ColorData由3个float(RGB)
这里是我的代码打开的JPEG文件
PixelBuffer * IOManager::load_jpg_to_pixel_buffer(const char *file_name){
struct jpeg_decompress_struct cinfo;
FILE * infile;
JSAMPARRAY buffer;
if ((infile = fopen(file_name, "rb")) == NULL) {
std::cout << "Could not open the jpg file: " << file_name << std::endl;
return nullptr;
}
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
int width = static_cast<int>(cinfo.output_width);
int height = static_cast<int>(cinfo.output_height);
std::cout << typeid(cinfo.colormap).name() << std::endl;
std::cout << "Width: " << width << "Height: " << height << std::endl;
PixelBuffer * image_buffer = new PixelBuffer(width, height, ColorData());
std::cout << cinfo.output_components << std::endl;
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, cinfo.output_width * cinfo.output_components, 1);
/* Step 6: while (scan lines remain to be read) */
/* jpeg_read_scanlines(...); */
/* Here we use the library's state variable cinfo.output_scanline as the
* loop counter, so that we don't have to keep track ourselves.
*/
while (cinfo.output_scanline < cinfo.output_height) {
/* jpeg_read_scanlines expects an array of pointers to scanlines.
* Here the array is only one element long, but you could ask for
* more than one scanline at a time if that's more convenient.
*/
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
/* Assume put_scanline_someplace wants a pointer and sample count. */
}
return nullptr;
}
我怎样才能从t RGB值他jpeg使用libjpeg?
答
RGB值在buffer
。它实际上是一个数组数组,所以你必须索引buffer[0]
。
像这样:
while (cinfo.output_scanline < cinfo.output_height)
{
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
// get the pointer to the row:
unsigned char* pixel_row = (unsigned char*)(buffer[0]);
// iterate over the pixels:
for(int i = 0; i < cinfo.output_width; i++)
{
// convert the RGB values to a float in the range 0 - 1
float red = (float)(*pixel_row++)/255.0f;
float green = (float)(*pixel_row++)/255.0f;
float blue = (float)(*pixel_row++)/255.0f;
}
}
这是假设cinfo.output_components
被3.
JPEG文件[编码的YCbCr(https://en.wikipedia.org/wiki/YCbCr#JPEG_conversion),可能与[色度子采样](https://en.wikipedia.org/wiki/Chroma_subsampling)。您必须编写必要的颜色转换代码,或者使用可以为您完成的库。 – Cornstalks
@Cornstalks,libjpeg具有内置的现成转换,您只需指定适当的'out_color_space' – Dmitry
@Dmitry:感谢您的更正! – Cornstalks