void * Jpeg::Compress(const void *source, int width, int height, int bpp, int &len, int quality) { JPEG_CORE_PROPERTIES jcprops; if ( ijlInit(&jcprops) != IJL_OK ) { ijlFree(&jcprops); return false; } jcprops.DIBWidth = width; jcprops.DIBHeight = height; jcprops.JPGWidth = width; jcprops.JPGHeight = height; jcprops.DIBBytes = (unsigned char *) source; jcprops.DIBPadBytes = 0; jcprops.DIBChannels = bpp; jcprops.JPGChannels = bpp; if ( bpp == 3 ) { jcprops.DIBColor = IJL_RGB; jcprops.JPGColor = IJL_YCBCR; jcprops.JPGSubsampling = IJL_411; jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0; } else { jcprops.DIBColor = IJL_G; jcprops.JPGColor = IJL_G; jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0; jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0; } int size = width*height*bpp; unsigned char * buffer = new unsigned char[size]; jcprops.JPGSizeBytes = size; jcprops.JPGBytes = buffer; jcprops.jquality = quality; if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK ) { ijlFree(&jcprops); delete buffer; return 0; } if ( ijlFree(&jcprops) != IJL_OK ) { delete buffer; return 0; } len = jcprops.JPGSizeBytes; return buffer; }
ILboolean iSaveJpegInternal(ILstring FileName, ILvoid *Lump, ILuint Size) { JPEG_CORE_PROPERTIES Image; ILuint Quality; ILimage *TempImage; ILubyte *TempData; imemclear(&Image, sizeof(JPEG_CORE_PROPERTIES)); if (iCurImage == NULL) { ilSetError(IL_ILLEGAL_OPERATION); return IL_FALSE; } if (FileName == NULL && Lump == NULL) { ilSetError(IL_INVALID_PARAM); return IL_FALSE; } if (iGetHint(IL_COMPRESSION_HINT) == IL_USE_COMPRESSION) Quality = 85; // Not sure how low we should dare go... else Quality = 99; if (ijlInit(&Image) != IJL_OK) { ilSetError(IL_LIB_JPEG_ERROR); return IL_FALSE; } if ((iCurImage->Format != IL_RGB && iCurImage->Format != IL_RGBA && iCurImage->Format != IL_LUMINANCE) || iCurImage->Bpc != 1) { if (iCurImage->Format == IL_BGRA) Temp = iConvertImage(iCurImage, IL_RGBA, IL_UNSIGNED_BYTE); else Temp = iConvertImage(iCurImage, IL_RGB, IL_UNSIGNED_BYTE); if (Temp == NULL) { return IL_FALSE; } } else { Temp = iCurImage; } if (TempImage->Origin == IL_ORIGIN_LOWER_LEFT) { TempData = iGetFlipped(TempImage); if (TempData == NULL) { if (TempImage != iCurImage) ilCloseImage(TempImage); return IL_FALSE; } } else { TempData = TempImage->Data; } // Setup DIB Image.DIBWidth = TempImage->Width; Image.DIBHeight = TempImage->Height; Image.DIBChannels = TempImage->Bpp; Image.DIBBytes = TempData; Image.DIBPadBytes = 0; // Setup JPEG Image.JPGWidth = TempImage->Width; Image.JPGHeight = TempImage->Height; Image.JPGChannels = TempImage->Bpp; switch (Temp->Bpp) { case 1: Image.DIBColor = IJL_G; Image.JPGColor = IJL_G; Image.JPGSubsampling = IJL_NONE; break; case 3: Image.DIBColor = IJL_RGB; Image.JPGColor = IJL_YCBCR; Image.JPGSubsampling = IJL_411; break; case 4: Image.DIBColor = IJL_RGBA_FPX; Image.JPGColor = IJL_YCBCRA_FPX; Image.JPGSubsampling = IJL_4114; break; } if (FileName != NULL) { Image.JPGFile = FileName; if (ijlWrite(&Image, IJL_JFILE_WRITEWHOLEIMAGE) != IJL_OK) { if (TempImage != iCurImage) ilCloseImage(TempImage); ilSetError(IL_LIB_JPEG_ERROR); return IL_FALSE; } } else { Image.JPGBytes = Lump; Image.JPGSizeBytes = Size; if (ijlWrite(&Image, IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK) { if (TempImage != iCurImage) ilCloseImage(TempImage); ilSetError(IL_LIB_JPEG_ERROR); return IL_FALSE; } } ijlFree(&Image); if (TempImage->Origin == IL_ORIGIN_LOWER_LEFT) ifree(TempData); if (Temp != iCurImage) ilCloseImage(Temp); return IL_TRUE; }
static bool EncodeToJPEGBuffer( byte* lpRgbBuffer, dword dwWidth, dword dwHeight, byte** lppJpgBuffer, dword* lpdwJpgBufferSize, int quality ) { bool bres = true; IJLERR jerr; dword dwRgbBufferSize; byte * lpTemp = NULL; // Allocate the IJL JPEG_CORE_PROPERTIES structure. JPEG_CORE_PROPERTIES jcprops; __try { // Initialize the Intel(R) JPEG Library. jerr = ijlInit(&jcprops); if(IJL_OK != jerr) { bres = false; __leave; } dwRgbBufferSize = dwWidth * dwHeight * 4; lpTemp = new byte [dwRgbBufferSize]; if(NULL == lpTemp) { bres = false; __leave; } // Set up information to write from the pixel buffer. jcprops.DIBWidth = dwWidth; jcprops.DIBHeight = dwHeight; // Implies a bottom-up DIB. jcprops.DIBBytes = lpRgbBuffer; jcprops.DIBPadBytes = 0; jcprops.DIBChannels = 4; jcprops.DIBColor = IJL_RGBA_FPX; jcprops.JPGWidth = dwWidth; jcprops.JPGHeight = dwHeight; jcprops.JPGFile = NULL; jcprops.JPGBytes = lpTemp; jcprops.JPGSizeBytes = dwRgbBufferSize; jcprops.JPGChannels = 4; jcprops.JPGColor = IJL_YCBCRA_FPX; jcprops.JPGSubsampling = IJL_4114; // 4:1:1 subsampling. jcprops.jquality = quality; // Write the actual JPEG image from the pixel buffer. jerr = ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE); if(IJL_OK != jerr) { bres = false; __leave; } } // __try __finally { if( bres == false ) { if(NULL != lpTemp) { delete[] lpTemp; lpTemp = NULL; } } *lppJpgBuffer = lpTemp; *lpdwJpgBufferSize = jcprops.JPGSizeBytes; // Clean up the Intel(R) JPEG Library. ijlFree(&jcprops); } return bres; } // EncodeToJPEGBuffer()