1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
#include "stdafx.h" #include <windows.h> #include <gdiplus.h> #include <stdio.h>
#pragma comment(lib, "gdiplus") using namespace Gdiplus;
INT GetEncoderClsid(const WCHAR* format, CLSID* pClsid); BOOL BmpToJpg(LPCWSTR LpBmpPath,ULONG UlQuality);
INT main() {
BmpToJpg(L"F:\\CProject\\VS2008test\\Debug\\14.bmp",40); return 0; }
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size); if(size == 0) return -1;
pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j) { if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; } }
free(pImageCodecInfo); return -1; }
BOOL BmpToJpg(LPCWSTR LpBmpPath,ULONG UlQuality) { BOOL bRet=FALSE; GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Image* image; WCHAR wstrDriv[_MAX_DRIVE],wstrDir[_MAX_DIR], wstrFilename[_MAX_FNAME],wstrExt[_MAX_EXT],wstrDesPath[MAX_PATH];
do { GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CLSID encoderClsid; EncoderParameters encoderParameters; ULONG quality=50; Status stat;
image=new Image(LpBmpPath); if (image==NULL) continue;
if(!GetEncoderClsid(L"image/jpeg", &encoderClsid)) continue;
encoderParameters.Count = 1; encoderParameters.Parameter[0].Guid = EncoderQuality; encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong; encoderParameters.Parameter[0].NumberOfValues = 1;
quality = UlQuality; encoderParameters.Parameter[0].Value = &quality;
_wsplitpath(LpBmpPath,wstrDriv,wstrDir,wstrFilename,wstrExt); swprintf(wstrDesPath,L"%ws%ws%ws.jpg",wstrDriv,wstrDir,wstrFilename);
stat=image->Save(wstrDesPath,&encoderClsid,&encoderParameters); if (stat!=S_OK) continue;
bRet=TRUE; } while (FALSE);
delete image; GdiplusShutdown(gdiplusToken);
return bRet;
}
|