大家好,这篇文中介绍了libjpeg-turbo的简单使用,大部分是copy,有一点自己的心得
libjpeg是一款开源的jpeg压缩解压库,具体信息参见百度百科。libjpeg-turbo是它的升级版,性能有所 提升,源码去他的官网可以下载 https://libjpeg-turbo.org/ 我用的1.2.1 最新的已经到2.0
对于libjpeg-turbo的使用官方有详细的说明文档 :
/ ******************** JPEG DECOMPRESSION样本界面******************* /
/ *这个例子的这一半显示了如何从JPEG解压缩器读取数据。
*这比上面更精致一点,因为我们显示:
*(a)如何修改JPEG库的标准错误报告行为;
*(b)如何使用库的内存管理器分配工作区。
*
*为了使这个例子与第一个例子有点不同,我们会
*假设我们不打算将整个图像放入内存中
*缓冲区,但要将其逐行发送到其他地方。我们需要一个单一的,
* scanline-high JSAMPLE数组作为工作缓冲区,我们将让JPEG
内存管理器为我们分配它。这种方法实际上非常有用
*因为我们不需要记住单独释放缓冲区:它
*清除JPEG对象时将自动消失。
* /
/ *
*错误处理:
*
* JPEG库的标准错误处理程序(jerror.c)分为
*几个“方法”,你可以单独重写。这可以让你
*调整行为而不重复大量的代码,你可能会这样做
*必须更新每个未来版本。
*
*我们的例子展示了如何覆盖“error_exit”方法
*发生致命错误时,控制权返回给库的调用者,
*而不是像标准error_exit方法那样调用exit()。
*
*我们使用C的setjmp / longjmp工具来返回控制。这意味着
*调用JPEG库的例程必须先执行setjmp()调用
*建立返回点。我们想要更换error_exit来做一个
* longjmp()。但是我们需要让setjmp缓冲区可以访问
* error_exit例程。要做到这一点,我们做一个私人的延伸
*标准的JPEG错误处理程序对象。(如果我们使用C ++,我们会说我们
*正在制作常规错误处理程序的子类。)
*
*这是扩展的错误处理程序结构:
* /
struct my_error_mgr {
struct jpeg_error_mgr pub; / *“公共”字段* /
jmp_buf setjmp_buffer; / *返回给调用者* /
};
typedef struct my_error_mgr * my_error_ptr;
/ *
*以下是将替换标准error_exit方法的例程:
* /
METHODDEF(无效)
my_error_exit(j_common_ptr cinfo)
{
/ * cinfo-> err真的指向一个my_error_mgr结构,所以强制指针* /
my_error_ptr myerr =(my_error_ptr)cinfo-> err;
/ *总是显示消息。* /
/ *如果我们选择了,我们可以推迟到返回之后。* /
(* cinfo-> err-> output_message)(cinfo);
/ *将控制权返回给setjmp点* /
longjmp(myerr-> setjmp_buffer,1);
}
/ *
* JPEG解压缩的示例程序。我们假设源文件名
*传入。我们希望成功返回1,错误时return 0。
* /
GLOBAL(INT)
read_JPEG_file(char * filename)
{
/ *此结构包含JPEG解压缩参数和指针
*工作空间(根据JPEG库的需要分配)。
* /
struct jpeg_decompress_struct cinfo;
/ *我们使用我们的专用扩展名JPEG错误处理程序。
*注意,这个结构必须和主要的JPEG参数一样长
* struct,以避免悬挂指针问题。
* /
struct my_error_mgr jerr;
/* 更多东西 */
文件* infile; /* 源文件 */
JSAMPARRAY缓冲区; / *输出行缓冲区* /
int row_stride; / *输出缓冲区中的物理行宽度* /
/ *在这个例子中,我们希望在做其他事情之前打开输入文件,
*以便下面的setjmp()错误恢复可以假定文件已打开。
*非常重要:如果你在一台机器上,使用“b”选项来打开()
*需要它来读取二进制文件。
* /
if((infile = fopen(filename,“rb”))== NULL){
fprintf(stderr&#x