- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试过关注 another answer但似乎无法做到这一点。我有大约 8MiB 的 RBGX 位图可以使用 libjpeg-turbo 在内存中转换为 jpeg。如果我使用 jpeg_stdio_dest
,我可以将整个内容写入一个文件,然后再读回该文件,这样就没问题了。然而,尝试使用 jpeg_mem_dest
一直是个谜。我的设置与 jpeg_stdio_dest
完全相同,但使用 mem
似乎只分配了一次 4KiB,然后不再分配任何空间。
我无法找到有关如何使用 jpeg_mem_dest
的进一步说明的文档,并且确实可以使用一些指导。
void compress(std::vector<unsigned char>& input) {
jpeg_compress_struct cinfo{};
jpeg_error_mgr err{};
cinfo.err = jpeg_std_error(&err);
jpeg_create_compress(&cinfo);
#if 0 // using this with an open FILE* out works
jpeg_stdio_dest(&cinfo, out);
#endif
cinfo.image_width = kWidth; // constants defined somewhere
cinfo.image_height = kHeight;
cinfo.input_components = 4;
cinfo.in_color_space = JCS_EXT_RGBX;
// what's wrong with this?
unsigned char* buf{};
unsigned long buf_sz{};
jpeg_mem_dest(&cinfo, &buf, &buf_sz);
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 70, true);
jpeg_start_compress(&cinfo, true);
while (cinfo.next_scanline < cinfo.image_height) {
auto row = static_cast<JSAMPROW>(&input[cinfo.next_scanline * 4 * kWidth]);
jpeg_write_scanlines(&cinfo, &row, 1);
// Always prints 4096, and buf never changes
std::cout << "buf_sz: " << buf_sz
<< " buf: " << static_cast<void*>(buf) << '\n';
}
jpeg_finish_compress(&cinfo);
// ...
// in reality, return the compressed data
}
最佳答案
是的,这根本不直观。提出 jpeg_mem_dest() 调整的程序员没有太多选择,扩展现有的 api 并不是那么容易,因为它最初并不是为了支持某个特性而设计的。完全不明显的是,直到 jpeg_finish_compress() 调用之后,您的变量才会更新。库中相关代码为:
METHODDEF(void)
term_mem_destination (j_compress_ptr cinfo)
{
my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
*dest->outbuffer = dest->buffer;
*dest->outsize = (unsigned long)(dest->bufsize - dest->pub.free_in_buffer);
}
注意“术语”这个词。该函数通过函数指针间接调用:
GLOBAL(void)
jpeg_finish_compress (j_compress_ptr cinfo)
{
//...
/* Write EOI, do final cleanup */
(*cinfo->marker->write_file_trailer) (cinfo);
(*cinfo->dest->term_destination) (cinfo);
//...
}
您对此无能为力。只需调整您的 std::cout 代码,将其移动到循环之后以适应库的工作方式。
注意这个函数的其他细节,也不是很明显。您必须释放()它创建的缓冲区。在提供的 cjpeg.c 示例程序中可见,main() 结束。
关于c++ - 如何使用 jpeg_mem_dest 使用 libjpeg-turbo 压缩到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40539089/
我正在使用 jpeglib 压缩 jpeg。正如文档所说,我需要自己释放缓冲区“mem”。但是当 jpeg_finish_compress 或 jpeg_destroy_compress 之后的 fr
我在搜索如何写入缓冲区而不是文件时遇到了这个问题,但我找不到一个很好的例子。 这就是 jpeglib.h 所说的,但我不确定如何使用它。 /* Data source and destination
我试过关注 another answer但似乎无法做到这一点。我有大约 8MiB 的 RBGX 位图可以使用 libjpeg-turbo 在内存中转换为 jpeg。如果我使用 jpeg_stdio_d
libjpeg8 包括这两个功能,但在 libjpeg-turbo 中有以下功能: //jconfig.h #define JPEG_LIB_VERSION 62 ... //jpeglib.h
我是一名优秀的程序员,十分优秀!