基于32位和64位Libjpeg库的压缩和解压缩函数的封装
来源:互联网 发布:java string 去空格 编辑:程序博客网 时间:2024/05/29 15:27
如果需要了解压缩和解压缩的原理,请点击:压缩和解压缩的原理
32位库和64位库中的函数 jpeg_stdio_src 有些小的区别,所以在解压缩时也有些区别。
一、基于32位libjpeg库的压缩和解压缩操作
1、解压缩操作:
其中:strFileName 为要解压缩的源文件名字,nSize=ImageWidth*ImageHeight。
pData指向存放解压缩后数据的地址,可以进行如下定义:
unsigned char *Buffer= new unsigned char[ImageWidth*ImageHeight];ZeroMemory(Buffer,ImageWidth*ImageHeight);
至于其它参数 nByteAdjust...等,是需要传出来供压缩时使用。封装好的解压缩函数如下:
BOOL DecodeJPG(char * strFileName,unsigned char * pData,int &nSize,int &nByteAdjust,int &nComponents,int &nImageWidth,int &nImageHeight){try{int nAdjust = 0;intnBmpSize = 0;DWORD fileSize = 0; FILE *f = NULL;HANDLE hFind; WIN32_FIND_DATA fileInfo; hFind = FindFirstFile(strFileName ,&fileInfo); if(hFind != INVALID_HANDLE_VALUE) {WriteLog("DecodeJPG-1");fileSize = fileInfo.nFileSizeLow ;}FindClose(hFind); BYTE * pJpgData = NULL;if (fileSize>0){pJpgData = new BYTE[fileSize];}struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;fopen_s(&f,strFileName,"rb");if (f == NULL){WriteLog("DecodeJPG-3");delete [] pJpgData;return FALSE;}fread(pJpgData,fileSize,1,f);fclose(f);cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);jpeg_stdio_src(&cinfo, (char *)pJpgData,fileSize);jpeg_read_header(&cinfo, TRUE);nAdjust = cinfo.image_width*cinfo.num_components%4;if (nAdjust) nAdjust = 4-nAdjust;nByteAdjust = nAdjust;nComponents = cinfo.num_components;nImageWidth = cinfo.image_width;nImageHeight = cinfo.image_height;nBmpSize = (cinfo.image_width*cinfo.num_components+nAdjust)*cinfo.image_height;if (nSize<nBmpSize){WriteLog("DecodeJPG-4");nSize = nBmpSize;delete [] pJpgData;return FALSE;}jpeg_start_decompress(&cinfo);JSAMPROW row_pointer[1];while (cinfo.output_scanline < cinfo.output_height){row_pointer[0] =(BYTE *) &pData[(cinfo.output_height - cinfo.output_scanline-1)*(cinfo.image_width*cinfo.num_components+nAdjust)];jpeg_read_scanlines(&cinfo,row_pointer ,1);}jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);delete [] pJpgData;return TRUE;}catch(...){WriteLog("DecodeJPG-异常");return FALSE;}}
2、压缩操作:
其中:strFileName为压缩后的文件名字,pData为要进行解压缩的数据,其它参数的值由解压缩时所得到。
BOOL CEnhanceToolDlg::EncodeJPG(char * strFileName,unsigned char * pData,int nSize,int nByteAdjust,int nComponents,int nImageWidth,int nImageHeight){try{char *outdata = new char[10000000];BYTE *pPallete=NULL;int nSizeJpg = 0;struct jpeg_compress_struct jcs;struct jpeg_error_mgr jem;jcs.err = jpeg_std_error(&jem);jpeg_create_compress(&jcs);jpeg_stdio_dest(&jcs, outdata,&nSizeJpg);jcs.image_width = nImageWidth; jcs.image_height = nImageHeight;jcs.input_components = nComponents;if (nComponents==1){jcs.in_color_space = JCS_GRAYSCALE;}else{ jcs.in_color_space = JCS_RGB;}jpeg_set_defaults(&jcs);jpeg_set_quality (&jcs, 80, true);jpeg_start_compress(&jcs, TRUE);JSAMPROW row_pointer[1];int row_stride;row_stride = jcs.image_width*nComponents;while (jcs.next_scanline < jcs.image_height) {row_pointer[0] =(BYTE *) & pData[jcs.next_scanline * (row_stride+nByteAdjust)];jpeg_write_scanlines(&jcs, row_pointer, 1);}jpeg_finish_compress(&jcs);jpeg_destroy_compress(&jcs);FILE *f=NULL;fopen_s(&f,strFileName,"wb");if (f){fwrite(outdata,nSizeJpg,1,f);fclose(f);}delete [] outdata;return TRUE;}catch(...){return FALSE;}}
一、基于64位libjpeg库的压缩和解压缩操作
首先定义解压缩和压缩操作需要的一些变量:
struct jpeg_error_mgr jem;struct jpeg_error_mgr jerr;struct jpeg_compress_struct jcs;struct jpeg_decompress_struct cinfo;cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);jcs.err = jpeg_std_error(&jem);jpeg_create_compress(&jcs);
BOOL DecodeJPG(char * strFileName,unsigned char * pData,int &nSize,int &nByteAdjust,int &nComponents,int &nImageWidth,int &nImageHeight, jpeg_decompress_struct* pCinfo){FILE* fp = NULL;try{char szLog[LOG_BUF] = {0};long nAdjust(0), nBmpSize(0), nComponent(0), nRet(0); if (NULL == (fp = fopen(strFileName, "rb"))){sprintf(szLog, "Open file(%s) error!", strFileName);WriteLog(szLog);return FALSE;}jpeg_stdio_src(pCinfo, fp);jpeg_read_header(pCinfo, TRUE);nAdjust = pCinfo->image_width * pCinfo->num_components % 4;if (nAdjust) {nAdjust = 4 - nAdjust;}nByteAdjust = nAdjust;nComponents = pCinfo->num_components;nImageWidth = pCinfo->image_width;nImageHeight = pCinfo->image_height;nBmpSize = (pCinfo->image_width * pCinfo->num_components + nAdjust) * pCinfo->image_height;if (nSize < nBmpSize){nSize = nBmpSize;if (fp){fclose(fp);fp = NULL;}WriteLog("goes here");return FALSE;}if (!jpeg_start_decompress(pCinfo)){WriteLog("jpeg_start_decompress() 失败");}JSAMPROW row_pointer[1];while (pCinfo->output_scanline < pCinfo->output_height){row_pointer[0] =(BYTE *) &pData[(pCinfo->output_height - pCinfo->output_scanline - 1) * (pCinfo->image_width * pCinfo->num_components + nAdjust)];jpeg_read_scanlines(pCinfo, row_pointer, 1);}jpeg_finish_decompress(pCinfo);if (fp){fclose(fp);fp = NULL;}return TRUE;}catch (...){if (fp){fclose(fp);fp = NULL;}WriteLog("DecodeJPG error!");return FALSE;}return FALSE;}
BOOL EncodeJPG(char* strFileName, unsigned char * pData, int nSize, int nByteAdjust, int nComponents, int nImageWidth, int nImageHeight, jpeg_compress_struct* pJcs){FILE* fp = NULL;try{long row_stride(0);BYTE *pPallete=NULL;JSAMPROW row_pointer[1];if (fp = fopen(strFileName, "wb")){jpeg_stdio_dest(pJcs, fp);pJcs->image_width = nImageWidth; pJcs->image_height = nImageHeight;pJcs->input_components = nComponents;if (nComponents == 1){pJcs->in_color_space = JCS_GRAYSCALE;}else{pJcs->in_color_space = JCS_RGB;}jpeg_set_defaults(pJcs);jpeg_set_quality (pJcs, 80, true);jpeg_start_compress(pJcs, TRUE);row_stride = pJcs->image_width * nComponents;while (pJcs->next_scanline < pJcs->image_height) {row_pointer[0] =(BYTE *) & pData[pJcs->next_scanline * (row_stride+nByteAdjust)];jpeg_write_scanlines(pJcs, row_pointer, 1);}jpeg_finish_compress(pJcs);fclose(fp);}return TRUE;}catch (...){if (fp){fclose(fp);fp = NULL;}WriteLog("EncodeJPG error!");return FALSE;}}
阅读全文
0 0
- 基于32位和64位Libjpeg库的压缩和解压缩函数的封装
- java和C#的压缩和解压缩
- C#封装的文件压缩和解压缩类
- 编译64位的libjpeg
- 文件的压缩和解压缩
- 压缩和解压缩的方法
- 压缩和解压缩的类
- 字符串的压缩和解压缩
- urlno的压缩和解压缩
- 文件的压缩和解压缩
- zipfile的压缩和解压缩
- Linux的压缩和解压缩
- 基于javascript的压缩和解压缩以及文件系统的demo
- 压缩dp的位运算
- linux下rar和zip文件的压缩和解压缩
- C# 压缩和解压缩(Gzip和Zip的方式)
- linux和aix下常用的压缩和解压缩命令
- C# 压缩和解压缩(Gzip和Zip的方式)
- 图像旋转算法与实现
- codeforces round 119 div2 A-D
- 苹果-iOS-ARKit
- 菜鸟笔记-2
- 创建tcp服务器
- 基于32位和64位Libjpeg库的压缩和解压缩函数的封装
- Android操作SQLite数据库
- SDUT-1196 排序问题
- 百钱买小鸡/*公鸡5文钱1只,母鸡三文钱一只,小鸡一文钱三只。现在用100文钱共买了100只鸡,问这100只鸡中,公鸡,母鸡,小鸡各是多少只?
- h5学习笔记:vue 路由部署服务器子目录问题
- 【神经网络张量化】Tensorizing Neural Networks笔记
- CentOS7虚拟机下设置固定IP
- 下拉刷新上拉加载数据列表实现(Kotlin版)
- Zabbix3.2邮件告警python脚本