libjpeg 的使用sample RGB转换到JPEG

本文提供了一个使用JPEG库保存图片的C++示例代码。通过创建压缩对象并设置参数,可以将24位512x512的RGB图片保存为JPEG格式。

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

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

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



示例代码如下:

 

extern "C"{ 
#include "jpeglib/jpeglib.h"
}
int _tmain(int argc, _TCHAR* argv[])
{
    //定义一个压缩对象,这个对象用于处理主要的功能
    jpeg_compress_struct jpeg;
    //用于错误信息
    jpeg_error_mgr jerr;

    //错误输出在绑定
    jpeg.err = jpeg_std_error(&jerr);
    
    //初始化压缩对象
    jpeg_create_compress(&jpeg);

    //定义压缩后的输出,这里输出到一个文件!
    FILE* pFile = fopen( "c://tt.jpeg","wb" );
    if( !pFile )
        return 0;
    //绑定输出
    jpeg_stdio_dest(&jpeg, pFile);

    //压缩参数设置。具体请到网上找相应的文档吧,参数很多,这里只设置主要的。
    //我设置为一个 24 位的 512 X 512大小的RGB图片
    jpeg.image_width = 512;
    jpeg.image_height = 512;
    jpeg.input_components  = 3;
    jpeg.in_color_space = JCS_RGB;
    //其它参数设置为默认的!
    jpeg_set_defaults(&jpeg);

    //开始压缩。执行这一行数据后,无法再设置参数了!
    jpeg_start_compress(&jpeg, TRUE);

    //定义一个数组,代表图片每一行的数据。3 代表 jpeg.input_components
    unsigned char oneRowImgData[ 512 * 3 ];
    for( int i=0;i<512*3;++i )
        oneRowImgData[i] = 0;
     
    JSAMPROW row_pointer[1];
    row_pointer[0] = oneRowImgData;
    //从上到下,设置图片中每一行的像素值
    for( int i=0;i<jpeg.image_height;++i )
    {
        oneRowImgData[ i ] = i%256;//随便给一个值
        //将一行数据写入!
        jpeg_write_scanlines( &jpeg,row_pointer,1 );
    }

    //结束压缩
    jpeg_finish_compress(&jpeg);

    //清空对象
    jpeg_destroy_compress(&jpeg);

    
    fclose( pFile ); pFile = NULL;
    return 0;
}

最后生成的图下如上

另一个参考文章:
http://ou800doc.caldera.com/en/jpeg/libjpeg.txt
 

### 将RGB565数据转换JPG图像 为了将RGB565格式的数据转换JPG图像,可以按照如下方式处理: #### 数据准备与解析 首先,确保获取到的是真正的RGB565格式的二进制流。如果原始数据是以十六进制字符串的形式保存,则需先将其化为实际的二进制表示形式[^2]。 对于每一对连续字节代表的一个像素颜色值,在Python中可以通过位操作来分离红色、绿色和蓝色分量。具体来说,高位字节包含了部分红通道以及全部绿通道的信息;低位字节则携带剩余的蓝通道信息加上一部分绿通道的内容。 ```python def rgb565_to_rgb888(rgb565): r = (rgb565 & 0xF800) >> 11 g = (rgb565 & 0x07E0) >> 5 b = rgb565 & 0x001F # Scale from 5/6 bits to 8 bits per channel r = int(r * 255 / 31) g = int(g * 255 / 63) b = int(b * 255 / 31) return (r, g, b) ``` 此函数接受一个整数作为输入参数`rgb565`,该整数由两个相邻字节组成,并返回对应的标准RGB三元组`(R,G,B)`,其中每个组件都是范围在0至255之间的整数值。 #### 创建PIL Image对象并保存为JPEG文件 一旦拥有了完整的RGB数组之后,就可以利用Python Imaging Library(Pillow库)创建一个新的Image实例并将这些色彩值填充进去。最后一步就是调用`.save()`方法指定目标路径连同所需的压缩质量选项一起传递给它以完成整个过程[^1]。 ```python from PIL import Image width, height = ... , ... image_data = [] # 假设这里已经填满了经过化后的(R,G,B)列表 img = Image.new('RGB', (width, height)) img.putdata(image_data) output_path = 'output_image.jpg' img.save(output_path, quality=95) ``` 以上代码片段展示了如何基于已有的RGB数据构建一张新的图片,并最终导出为高质量级别的JPEG格式文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值