由于要压缩成 JPG 文件,我用的是 Intel ilj 库,别说你没听过哦,可压缩 YUYV和 Bmp,以下是我的 JpegEncoder,
使用简单,接口清晰,谁用谁知道。至于在客户端显示 JPG,我就交给 OleLoadPicture 了,因为 ilj 在解压的时候,有时会内存泄露,但是 OleLoadPicture 在使用时会有个问题就是如果 JPG 文件本身有问题,会造成 OleLoadPicture 死锁,我查了一下,据说是 Microsoft 的 BUG,这么长时间了也不知道 Fix 没有。不过 OleLoadPicture 死锁在这个程序是不太可能出现的,我说的是我在公司的情况,细节我就不说了。
使用简单,接口清晰,谁用谁知道。至于在客户端显示 JPG,我就交给 OleLoadPicture 了,因为 ilj 在解压的时候,有时会内存泄露,但是 OleLoadPicture 在使用时会有个问题就是如果 JPG 文件本身有问题,会造成 OleLoadPicture 死锁,我查了一下,据说是 Microsoft 的 BUG,这么长时间了也不知道 Fix 没有。不过 OleLoadPicture 死锁在这个程序是不太可能出现的,我说的是我在公司的情况,细节我就不说了。
#ifndef JPEGEncoder_H
#define JPEGEncoder_H
//
#include <Windows.h>
//
#include "ijl.h"
//
#pragma comment(lib, "ijl15l.lib")
//
template <DWORD dwUnique>
class JPEGEncoderT
{
public:
JPEGEncoderT()
{
ijlInit(&m_jpeg);
}
~JPEGEncoderT()
{
ijlFree(&m_jpeg);
}
//
IJLERR Encode(DWORD dwWidth, DWORD dwHeight, LPVOID lpRGBSrc, DWORD dwSrcLength, LPVOID lpJPEGDst, DWORD dwDstLength, LPDWORD lpJPEGSize, DWORD dwBitCount)
{
DWORD dwByteCount = dwBitCount / 8;
if (lpRGBSrc == NULL || lpJPEGDst == NULL || dwSrcLength == 0 || dwDstLength == 0 || lpJPEGSize == NULL) {
return IJL_MEMORY_ERROR;
}
if (dwDstLength < (dwWidth * dwHeight)) {
return IJL_BUFFER_TOO_SMALL;
}
IJLERR ijlError = IJL_RESERVED;
m_jpeg.upsampling_reqd = FALSE;
m_jpeg.cconversion_reqd = FALSE;
m_jpeg.DIBBytes = (LPBYTE) lpRGBSrc;
m_jpeg.JPGBytes = (LPBYTE) lpJPEGDst;
m_jpeg.DIBWidth = dwWidth;
m_jpeg.DIBHeight = -dwHeight;
m_jpeg.JPGWidth = dwWidth;
m_jpeg.JPGHeight = dwHeight;
m_jpeg.DIBSubsampling= IJL_NONE;
m_jpeg.JPGFile = NULL;
m_jpeg.JPGSizeBytes = dwDstLength;
m_jpeg.jquality = 100;
//
m_jpeg.DIBChannels = dwByteCount;
m_jpeg.JPGChannels = dwByteCount;
m_jpeg.DIBPadBytes = IJL_DIB_PAD_BYTES(m_jpeg.DIBWidth, dwByteCount);
switch (dwBitCount) {
case 24:
m_jpeg.DIBColor = IJL_BGR;
m_jpeg.JPGColor = IJL_YCBCR;
m_jpeg.JPGSubsam