前面有文章,将RGB格式转换为JPG文件。近来工作需要,需要RGB转换为JPG格式到内存。这事……
int rgb2jpgAction(struct jpeg_compress_struct* pCinfo, const char *pRgbData, const int width, const int height) { int depth = RGB_COUNT; JSAMPROW row_pointer[1]; pCinfo->image_width = width; pCinfo->image_height = height; pCinfo->input_components = depth; pCinfo->in_color_space = JCS_RGB; jpeg_set_defaults( pCinfo); jpeg_set_quality( pCinfo, JPEG_QUALITY, TRUE ); jpeg_start_compress(pCinfo, TRUE); int row_stride = width * depth; while (pCinfo->next_scanline < pCinfo->image_height) { row_pointer[0] = (JSAMPROW)(pRgbData + pCinfo->next_scanline * row_stride); jpeg_write_scanlines(pCinfo, row_pointer, 1); } jpeg_finish_compress( pCinfo); jpeg_destroy_compress(pCinfo); return 0; } /** 这里特别说明jpeg_mem_dest的第二个参数,buffer。 如果在rgb2jpg声明指针或者缓冲区,然后试图复制到pDest,直接崩溃;或者取不到数据。 研究了半天不行。必须是如下的写法。 如果缓冲区不够怎么办?那就开大一点。 char pDest[512*1024]; int size=512*1024; 然后再传递过来。 */ int rgb2jpg(const char *pRgbData, const int width, const int height, int type, char* pDest, int* pSize) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE* pOutFile = NULL; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); if (type) { if ((pOutFile = fopen(pDest, "wb")) == NULL) { return -1; } jpeg_stdio_dest(&cinfo, pOutFile); } else { jpeg_mem_dest(&cinfo, (unsigned char **)&pDest, (long unsigned int *)pSize); } rgb2jpgAction(&cinfo, pRgbData, width, height); if (type) { fclose(pOutFile); } return 0; }