VC++直接利用api实现bmp图像转jpg图像

文章目录

网上找了很久寻找直接bmp格式转jpg,大部分都是利用libjpeg/libjpeg-turbo实现的。libjpeg实现有很多有点支持多平台Windows/linux/嵌入式,但是使用较为麻烦,需要自己编译lib可能还需要自己懂一点make语法之类的。so 能不能直接在Windows找个api实现呢?遂打开msdn输入”bmp converting to jpg”,还不错找到两个相关问题链接1链接2 。使用GDI+.aspx)、CImage.aspx),而且使用这些几乎可以实现任何图片格式之间的转换GDI+库封装了很多图像处理相关的函数还有很多待学习。例子只是一个很简单的bmp转jpg

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
// bmp2jpg.cpp : 定义控制台应用程序的入口点。
//https://msdn.microsoft.com/en-us/library/ms533844(v=vs.85).aspx
//http://www.cnblogs.com/carekee/articles/1824069.html
#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); // helper function
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; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure

pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure

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; // Success
}
}

free(pImageCodecInfo);
return -1; // Failure
}

//************************************
// 函数名称: BmpToJpg
// 函数说明:
// 返 回 值: bool
// 参 数: LPCSTR LpBmpPath 要转换的bmp图像位置
// 参 数: ULONG UlQuality 转换质量
// 备注日期:2015/08/25
// 修改记录:需要gdiplus.h及lib
//************************************
BOOL BmpToJpg(LPCWSTR LpBmpPath,ULONG UlQuality)
{

BOOL bRet=FALSE;
// Initialize GDI+.
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;

}