libjpeg-jpeg压缩与解压缩
来源:互联网 发布:qt 跨线程使用数据库 编辑:程序博客网 时间:2024/06/15 18:39
bool MapScene::JPEGCompress(char *ppafScan, char **pDest, unsigned long &dwNewAndSendLen, int nImgSizeX, int nImgSizeY)
{
if (ppafScan == NULL)
{
return false;
}
struct jpeg_compress_struct jcs;
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
jcs.input_components = 4;
char *pCompressBuffer = NULL;
dwNewAndSendLen = nImgSizeX*nImgSizeY*jcs.input_components;
jpeg_mem_dest(&jcs, (unsigned char **)&pCompressBuffer, &dwNewAndSendLen);
jcs.image_width = nImgSizeX;
jcs.image_height = nImgSizeY;
jcs.in_color_space = JCS_EXT_RGBA;
jpeg_set_defaults(&jcs);
jpeg_set_quality(&jcs, 70, TRUE);
jpeg_start_compress(&jcs, TRUE);
//压缩源数据
JSAMPROW *rowPointer = new JSAMPROW[jcs.image_height];
for (int dy = 0; dy < jcs.image_height; dy++)
{
rowPointer[dy] = (JSAMPROW)(&(ppafScan)[dy * jcs.image_width * jcs.input_components]);
jpeg_write_scanlines(&jcs, &rowPointer[dy], 1);
}
jpeg_finish_compress(&jcs);
jpeg_destroy_compress(&jcs);
if (NULL != *pDest)
{
free(*pDest);
}
*pDest = (char*)malloc(dwNewAndSendLen);
memset(*pDest, 0, dwNewAndSendLen);
memcpy(*pDest, pCompressBuffer, dwNewAndSendLen);
if (NULL != rowPointer)
{
delete[]rowPointer;
rowPointer = NULL;
}
return true;
}
JPEGCompress((char*)pImagineData, &outBuffer, outSize, dWidth, dHeight);
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
///* Now we can initialize the JPEG decompression object. */
jpeg_create_decompress(&cinfo);
////测试数据完整性
////Step 2: specify data source (eg, a file)
jpeg_mem_src(&cinfo, (unsigned char*)outBuffer, outSize);
//Step 3: read file parameters with jpeg_read_header()
(void)jpeg_read_header(&cinfo, TRUE);
//启用快速解码
cinfo.do_fancy_upsampling = FALSE;
cinfo.out_color_space = JCS_EXT_RGBA;//默认是RGB
(void)jpeg_start_decompress(&cinfo);
unsigned int width = 0, height = 0;
int color_space = 4;
width = cinfo.image_width;
height = cinfo.image_height;
color_space = cinfo.out_color_components;
unsigned char* p = new unsigned char[width*height*color_space];
unsigned char *op = p;
int numlines = 0;
while (cinfo.output_scanline < cinfo.output_height)
{
numlines = jpeg_read_scanlines(&cinfo, &p, 1);
p += numlines * width*color_space;
}
(void)jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
//释放内存
if (outBuffer != NULL)//源码中申请了内存,但并没有进行释放。需要人为释放
{
delete[] outBuffer;
outBuffer = NULL;
}
{
if (ppafScan == NULL)
{
return false;
}
struct jpeg_compress_struct jcs;
struct jpeg_error_mgr jem;
jcs.err = jpeg_std_error(&jem);
jpeg_create_compress(&jcs);
jcs.input_components = 4;
char *pCompressBuffer = NULL;
dwNewAndSendLen = nImgSizeX*nImgSizeY*jcs.input_components;
jpeg_mem_dest(&jcs, (unsigned char **)&pCompressBuffer, &dwNewAndSendLen);
jcs.image_width = nImgSizeX;
jcs.image_height = nImgSizeY;
jcs.in_color_space = JCS_EXT_RGBA;
jpeg_set_defaults(&jcs);
jpeg_set_quality(&jcs, 70, TRUE);
jpeg_start_compress(&jcs, TRUE);
//压缩源数据
JSAMPROW *rowPointer = new JSAMPROW[jcs.image_height];
for (int dy = 0; dy < jcs.image_height; dy++)
{
rowPointer[dy] = (JSAMPROW)(&(ppafScan)[dy * jcs.image_width * jcs.input_components]);
jpeg_write_scanlines(&jcs, &rowPointer[dy], 1);
}
jpeg_finish_compress(&jcs);
jpeg_destroy_compress(&jcs);
if (NULL != *pDest)
{
free(*pDest);
}
*pDest = (char*)malloc(dwNewAndSendLen);
memset(*pDest, 0, dwNewAndSendLen);
memcpy(*pDest, pCompressBuffer, dwNewAndSendLen);
if (NULL != rowPointer)
{
delete[]rowPointer;
rowPointer = NULL;
}
return true;
}
JPEGCompress((char*)pImagineData, &outBuffer, outSize, dWidth, dHeight);
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
///* Now we can initialize the JPEG decompression object. */
jpeg_create_decompress(&cinfo);
////测试数据完整性
////Step 2: specify data source (eg, a file)
jpeg_mem_src(&cinfo, (unsigned char*)outBuffer, outSize);
//Step 3: read file parameters with jpeg_read_header()
(void)jpeg_read_header(&cinfo, TRUE);
//启用快速解码
cinfo.do_fancy_upsampling = FALSE;
cinfo.out_color_space = JCS_EXT_RGBA;//默认是RGB
(void)jpeg_start_decompress(&cinfo);
unsigned int width = 0, height = 0;
int color_space = 4;
width = cinfo.image_width;
height = cinfo.image_height;
color_space = cinfo.out_color_components;
unsigned char* p = new unsigned char[width*height*color_space];
unsigned char *op = p;
int numlines = 0;
while (cinfo.output_scanline < cinfo.output_height)
{
numlines = jpeg_read_scanlines(&cinfo, &p, 1);
p += numlines * width*color_space;
}
(void)jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
//释放内存
if (outBuffer != NULL)//源码中申请了内存,但并没有进行释放。需要人为释放
{
delete[] outBuffer;
outBuffer = NULL;
}
0 0
- libjpeg-jpeg压缩与解压缩
- JPEG 压缩与解压缩
- 快速jpeg压缩与解压,libjpeg库的使用
- libjpeg-turbo解压与压缩JPEG图像原理
- libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率
- jpeg压缩解压缩简介
- jpeg压缩解压缩简介
- jpeg压缩解压缩简介
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 开源JPEG图像(解)压缩库libjpeg的编译与使用示例(以VS2010为例)
- 使用libjpeg在linux内核中压缩JPEG图片
- libjpeg实现内存内位图的压缩及解压缩
- 【LeetCode】125. Valid Palindrome
- 安装FTPSERVER的过程
- 1622-5 孔富晨 总结《2017年1月6日》 【连续第98天总结】
- dom系列:Node操作
- HTML DOM Attribute 对象
- libjpeg-jpeg压缩与解压缩
- 1622-5 孔富晨 总结《2017年1月7日》 【连续第99天总结】
- 算法训练 寻找数组中最大值
- FOX算法的MPI实现
- 《算法》 摘选
- 1622-5 孔富晨 总结《2017年1月8日》 【连续第100天总结】
- mac 完全卸载intellij
- Linux系统动态、静态IP配置
- 七(1).DOM的核心对象:Node 分析