基于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;}}



原创粉丝点击