BOOL WriteRGBBytesIntoJpegFile(const CString& strOutFileName, const int nWidth, const int nHeight, const int nQuality, BYTE* pBuffer)
{
struct jpeg_compress_struct cinfo;
struct extended_error_mgr jerr;
JSAMPROW row_pointer[1];
int row_stride;
FILE* outfile;
if ((outfile = _tfopen(strOutFileName, TEXT("wb"))) == NULL) {
strError.Format(CANT_OPEN_FILE, strOutFileName);
return FALSE;
}
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = extended_error_exit;
jerr.pub.output_message = extended_output_message;
jerr.pub.reset_error_mgr = extended_reset_error_mgr;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_compress(&cinfo);
fclose(outfile);
return FALSE;
}
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = nWidth;
cinfo.image_height = nHeight;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, nQuality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
row_stride = nWidth * 3;
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = & pBuffer[cinfo.next_scanline * row_stride];
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
return TRUE;
}