我发现这个函数使用libjpeg写入文件:
int write_jpeg_file( char *filename )
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
/* this is a pointer to one row of image data */
JSAMPROW row_pointer[1];
FILE *outfile = fopen( filename, "wb" );
if ( !outfile )
{
printf("Error opening output jpeg file %s\n!", filename );
return -1;
}
cinfo.err = jpeg_std_error( &jerr );
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
/* Setting the parameters of the output file here */
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = bytes_per_pixel;
cinfo.in_color_space = color_space;
/* default compression parameters, we shouldn't be worried about these */
jpeg_set_defaults( &cinfo );
/* Now do the compression .. */
jpeg_start_compress( &cinfo, TRUE );
/* like reading a file, this time write one row at a time */
while( cinfo.next_scanline < cinfo.image_height )
{
row_pointer[0] = &raw_image[ cinfo.next_scanline * cinfo.image_width * cinfo.input_components];
jpeg_write_scanlines( &cinfo, row_pointer, 1 );
}
/* similar to read file, clean up after we're done compressing */
jpeg_finish_compress( &cinfo );
jpeg_destroy_compress( &cinfo );
fclose( outfile );
/* success code is 1! */
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我实际上需要将jpeg压缩图像写入内存缓冲区,而不将其保存到文件中,以节省时间.有人可以举个例子来说明怎么做吗?
我一直在网上搜索一段时间,但如果有任何例子也难以获得,那么文档非常罕见.
Mar*_*som 14
您可以非常轻松地定义自己的目标管理器.它jpeg_compress_struct包含一个指向a的指针jpeg_destination_mgr,它包含一个指向缓冲区的指针,缓冲区中剩余的空间计数,以及3个指向函数的指针:
init_destination (j_compress_ptr cinfo)
empty_output_buffer (j_compress_ptr cinfo)
term_destination (j_compress_ptr cinfo)
Run Code Online (Sandbox Code Playgroud)
在第一次调用jpeg库之前需要填写函数指针,让这些函数处理缓冲区.如果您创建的缓冲区大于您期望的最大可能输出,则这变得微不足道; init_destination只需填写缓冲区指针和计数,empty_output_buffer并且term_destination什么都不做.
这是一些示例代码:
std::vector<JOCTET> my_buffer;
#define BLOCK_SIZE 16384
void my_init_destination(j_compress_ptr cinfo)
{
my_buffer.resize(BLOCK_SIZE);
cinfo->dest->next_output_byte = &my_buffer[0];
cinfo->dest->free_in_buffer = my_buffer.size();
}
boolean my_empty_output_buffer(j_compress_ptr cinfo)
{
size_t oldsize = my_buffer.size();
my_buffer.resize(oldsize + BLOCK_SIZE);
cinfo->dest->next_output_byte = &my_buffer[oldsize];
cinfo->dest->free_in_buffer = my_buffer.size() - oldsize;
return true;
}
void my_term_destination(j_compress_ptr cinfo)
{
my_buffer.resize(my_buffer.size() - cinfo->dest->free_in_buffer);
}
cinfo->dest->init_destination = &my_init_destination;
cinfo->dest->empty_output_buffer = &my_empty_output_buffer;
cinfo->dest->term_destination = &my_term_destination;
Run Code Online (Sandbox Code Playgroud)
dmi*_*lev 14
有一个预定义的函数jpeg_mem_src定义jdatasrc.c.最简单的用法示例:
unsigned char *mem = NULL;
unsigned long mem_size = 0;
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_mem_dest(&cinfo, &mem, &mem_size);
// do compression
// use mem buffer
Run Code Online (Sandbox Code Playgroud)
不要忘记释放缓冲区.
| 归档时间: |
|
| 查看次数: |
19616 次 |
| 最近记录: |