Go初接触之libjpeg

Stella981
• 阅读 648

  libjpeg-turbo是一个效率很高的图片处理的C库,所以严格来说放在Go这里不太妥当,但是之后我们会把它封装成Go可以调用的类库。据说libjpeg-turbo在处理jpeg格式图片时比ImageMagick库效率高了三倍,参照示例代码写了一个缩略图的功能:

 1 //
 2 //  main.cpp
 3 //  libjpegturbo
 4 //
 5 //  Created by 张皓然 on 2018/4/17.
 6 //  Copyright © 2018年 张皓然. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include "/opt/libjpeg-turbo/include/jpeglib.h"
11 
12 using namespace std;
13 
14 int compress_JPEG_file(string strImageName, string strDstImageName, int quality, int scale_num, int scale_denom) {
15     //创建必要变量,后缀in是源图片信息,out是目标图片信息,buffer是缓冲区
16     struct jpeg_decompress_struct cinfo_in;
17     struct jpeg_compress_struct cinfo_out;
18     struct jpeg_error_mgr jerr_in, jerr_out;
19     FILE *infile, *outfile;
20     JSAMPARRAY buffer;
21     //表示每行的宽度,为width*components
22     int row_stride;
23     
24     //初始化对象
25     jpeg_create_decompress(&cinfo_in);
26     jpeg_create_compress(&cinfo_out);
27     //绑定错误结构
28     cinfo_in.err = jpeg_std_error(&jerr_in);
29     cinfo_out.err = jpeg_std_error(&jerr_out);
30     //C库方式打开图片文件,并填入cinfo对象
31     if((infile = fopen(strImageName.c_str(), "rb")) == NULL) {
32         fprintf(stderr, "can't open %s\n", strImageName.c_str());
33         return -1;
34     }
35     if((outfile = fopen(strDstImageName.c_str(), "wb")) == NULL) {
36         fprintf(stderr, "can't open %s\n", strDstImageName.c_str());
37         return -1;
38     }
39     jpeg_stdio_src(&cinfo_in, infile);
40     jpeg_stdio_dest(&cinfo_out, outfile);
41     //读取文件信息
42     jpeg_read_header(&cinfo_in, TRUE);
43     
44     //设定文件压缩比例,M/N
45     cinfo_in.scale_num = scale_num;
46     cinfo_in.scale_denom = scale_denom;
47     
48     //开始解压缩
49     jpeg_start_decompress(&cinfo_in);
50     
51     //将压缩后的信息存入cinfo_out中作为新图片的参数
52     cinfo_out.image_height = cinfo_in.output_height;
53     cinfo_out.image_width = cinfo_in.output_width;
54     cinfo_out.input_components = 3;
55     cinfo_out.in_color_space = JCS_RGB;
56     jpeg_set_defaults(&cinfo_out);
57     //设置图片质量
58     jpeg_set_quality(&cinfo_out, quality, TRUE);
59     //开始压缩
60     jpeg_start_compress(&cinfo_out, TRUE);
61     
62     //设定每行的宽度准备写入,并分配缓冲区空间
63     row_stride = cinfo_in.output_width * cinfo_in.output_components;
64     buffer = (*cinfo_in.mem -> alloc_sarray)((j_common_ptr)&cinfo_in, JPOOL_IMAGE, row_stride, 1);
65     
66     while(cinfo_in.output_scanline < cinfo_in.output_height) {
67         //从in中读取数据并写入out中
68         jpeg_read_scanlines(&cinfo_in, buffer, 1);
69         jpeg_write_scanlines(&cinfo_out, buffer, 1);
70     }
71     
72     //结束,释放变量
73     jpeg_finish_decompress(&cinfo_in);
74     jpeg_destroy_decompress(&cinfo_in);
75     
76     jpeg_finish_compress(&cinfo_out);
77     jpeg_destroy_compress(&cinfo_out);
78     
79     fclose(infile);
80     fclose(outfile);
81     
82     return 0;
83 }
84 
85 int main() {
86     clock_t start, finish;
87     start = clock();
88     for(int i = 0; i < 100; i ++) compress_JPEG_file("/Users/zhanghaoran/Desktop/abc.jpg", "/Users/zhanghaoran/Desktop/abc_compress.jpg", 80, 1, 2);
89     finish = clock();
90     cout << "Total : " << (double)(finish - start) / CLOCKS_PER_SEC << endl;
91 }
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Stella981 Stella981
2年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这