libjpeg 的使用sample RGB转换到JPEG

本文提供了一个使用JPEG库保存24位RGB图片的C++示例代码,详细展示了如何设置图片尺寸、颜色空间等参数,并将图片数据写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想在程序中用到JPEG的图片保存,所以花了点时间。一开始在网上找资源,发现现成的还不好找,所以,贴出来共享!

首先到网上找相应的库文件,这个大家到网上Google一下就可以了

示例代码如下:
  1. extern "C"
  2. #include "jpeglib/jpeglib.h"
  3. }
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.     //定义一个压缩对象,这个对象用于处理主要的功能
  7.     jpeg_compress_struct jpeg;
  8.     //用于错误信息
  9.     jpeg_error_mgr jerr;
  10.     //错误输出在绑定
  11.     jpeg.err = jpeg_std_error(&jerr);
  12.     
  13.     //初始化压缩对象
  14.     jpeg_create_compress(&jpeg);
  15.     //定义压缩后的输出,这里输出到一个文件!
  16.     FILE* pFile = fopen( "c://tt.jpeg","wb" );
  17.     if( !pFile )
  18.         return 0;
  19.     //绑定输出
  20.     jpeg_stdio_dest(&jpeg, pFile);
  21.     //压缩参数设置。具体请到网上找相应的文档吧,参数很多,这里只设置主要的。
  22.     //我设置为一个 24 位的 512 X 512大小的RGB图片
  23.     jpeg.image_width = 512;
  24.     jpeg.image_height = 512;
  25.     jpeg.input_components  = 3;
  26.     jpeg.in_color_space = JCS_RGB;
  27.     //其它参数设置为默认的!
  28.     jpeg_set_defaults(&jpeg);
  29.     //开始压缩。执行这一行数据后,无法再设置参数了!
  30.     jpeg_start_compress(&jpeg, TRUE);
  31.     //定义一个数组,代表图片每一行的数据。3 代表 jpeg.input_components
  32.     unsigned char oneRowImgData[ 512 * 3 ];
  33.     forint i=0;i<512*3;++i )
  34.         oneRowImgData[i] = 0;
  35.      
  36.     JSAMPROW row_pointer[1];
  37.     row_pointer[0] = oneRowImgData;
  38.     //从上到下,设置图片中每一行的像素值
  39.     forint i=0;i<jpeg.image_height;++i )
  40.     {
  41.         oneRowImgData[ i ] = i%256;//随便给一个值
  42.         //将一行数据写入!
  43.         jpeg_write_scanlines( &jpeg,row_pointer,1 );
  44.     }
  45.     //结束压缩
  46.     jpeg_finish_compress(&jpeg);
  47.     //清空对象
  48.     jpeg_destroy_compress(&jpeg);
  49.     
  50.     fclose( pFile ); pFile = NULL;
  51.     return 0;
  52. }
最后生成的图下如上

另一个参考文章:
http://ou800doc.caldera.com/en/jpeg/libjpeg.txt
使用libjpeg-turbo库将YUV图像转换JPEG图像,可以按照以下步骤进行: 1. 准备好YUV图像数据,包括图像宽度、高度、采样格式、YUV数据缓冲区等。 2. 定义一个jpeg_compress_struct结构体,用于设置JPEG图像的压缩参数。 ```c jpeg_compress_struct cinfo; ``` 3. 初始化jpeg_compress_struct结构体,并设置压缩参数。其中,input_components表示输入图像的每个像素包含的颜色分量数,通常为3(表示RGB颜色空间),quality表示压缩质量,取值范围为0-100。 ```c jpeg_create_compress(&cinfo); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_YCbCr; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); ``` 4. 定义一个jpeg_error_mgr结构体,用于处理JPEG图像压缩过程中的错误信息。 ```c jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); ``` 5. 调用jpeg_stdio_dest函数设置JPEG图像输出文件。 ```c FILE *outfile = fopen(output_filename, "wb"); jpeg_stdio_dest(&cinfo, outfile); ``` 6. 调用jpeg_start_compress函数,开始压缩JPEG图像。 ```c jpeg_start_compress(&cinfo, TRUE); ``` 7. 循环读取YUV图像数据,并使用jpeg_write_scanlines函数将每行数据转换JPEG格式写入输出文件中。 ```c JSAMPROW row_pointer[1]; int row_stride = width * 3; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &yuv_data[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } ``` 8. 调用jpeg_finish_compress函数和jpeg_destroy_compress函数结束压缩JPEG图像过程。 ```c jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); ``` 完整代码示例: ```c #include <stdio.h> #include <jpeglib.h> int yuv_to_jpeg(const char *output_filename, unsigned char *yuv_data, int width, int height, int quality) { jpeg_compress_struct cinfo; jpeg_error_mgr jerr; FILE *outfile; JSAMPROW row_pointer[1]; int row_stride; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); outfile = fopen(output_filename, "wb"); if (outfile == NULL) { return -1; } jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_YCbCr; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = width * 3; while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &yuv_data[cinfo.next_scanline * row_stride]; jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值