源码和怎么安装使用guetzli查看文章www.ctrlqun.com/paper/paper_3.html。
闲话不说,直奔主题,执行 guetzli test.rgba out.jpg
//判断是不是png格式
if (in_data.size() >= 8 &&
memcmp(in_data.data(), kPNGMagicBytes, sizeof(kPNGMagicBytes)) == 0) {
int xsize, ysize;
std::vector rgb;
if (!ReadPNG(fin, &xsize, &ysize, &rgb)) {
fprintf(stderr, "Error reading PNG data from input file\n");
return 1;
}
if (!guetzli::Process(params, &stats, rgb, xsize, ysize, &out_data)) {
fprintf(stderr, "Guetzli processing failed\n");
return 1;
}
} else {//其他格式
if (!guetzli::Process(params, &stats, in_data, &out_data)) {
fprintf(stderr, "Guetzli processing failed\n");
return 1;
}
}
if (!ReadJpeg(data, JPEG_READ_ALL, &jpg)) {
fprintf(stderr, "Can't read jpg data from input file\n");//报错位置
return false;
}
看到调用报错位置,即程序ReadJpeg出问题,继续进入ReadJpeg
bool ReadJpeg(const uint8_t* data, const size_t len, JpegReadMode mode,
JPEGData* jpg) {
size_t pos = 0;
// Check SOI marker.
EXPECT_MARKER();//报错位置
....
#define EXPECT_MARKER() \
if (pos + 2 > len || data[pos] != 0xff) { \
fprintf(stderr, "Marker byte (0xff) expected, found: %d " \
"pos=%d len=%d\n", \
(pos < len ? data[pos] : 0), static_cast(pos), \
static_cast(len)); \
jpg->error = JPEG_MARKER_BYTE_NOT_FOUND; \
return false; \
}
char *screen_buf = (char *)malloc(PBUF_SIZE);//需要在main()之前进行定义#define PBUF_SIZE 614400
memset(screen_buf, 0, PBUF_SIZE); //这里的PBUF_SIZE 为宽320 高480 的像素size大小 614400 = 320*480*4
for (int i = 0; i < (in_data.size()/4); i++) {//in_data为读取的文件内容
memcpy(screen_buf+i*3, in_data.data()+i*4, 3);//每四个取三个
}
int sizeofbuf = 3*(in_data.size()/4); //rgba转为rgb后的size大小
int xsize = 320, ysize = 480;//xsize为原始图片宽,ysize为原始图片高
std::vector rgb(screen_buf, screen_buf+sizeofbuf);//初始化rgb,含义是将screen_buf 初始位置之后sizeofbuf的内容给rgb