gdi+一般用到mfc或win32程序中,网上的例子很多,这里使用的是控制台应用程序
加载头文件
#include <GdiPlus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
1.初始化gdi+
GdiplusStartupInput gdiplusStartupinput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken,&gdiplusStartupinput,NULL);
2.关闭gdi+(这句在程序的最后,因为start和shutdown是成对出现的,所以一块说了)
GdiplusShutdown(gdiplusToken);
3.中间是自己的程序
我用的是将文字按照格式要求绘制到图片中保存或是得到图片的数据,只用到gdi+中的入门知识
1). 建立bitmap对象,用作绘制的对象
Bitmap bmp(/*宽*/, /*高*/, ...);
2). 字体格式
wchar_t fontname[ ] = L"Arial";
FontFamily ff(format);
wchar_t text[ ] = L"abc123哥的爱家";
StringFormat sf;
GraphicsPath gp;
gp.AddString(text,wcslen(words),&ff,0,90,Point(0,0),&sf);
Graphics *gpbmp=Graphics::FromImage((Image*)&bmp);
gpbmp->SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿
Pen pen(Color(255,0,0,0),4);//outline
pen.SetLineJoin(LineJoinRound);
gpbmp->DrawPath(&pen,&gp);
SolidBrush sb(Color(255,0,255,0));//text
gpbmp->FillPath(&sb,&gp);
/*还可以绘制阴影,跟text是同样的方法*/
/*简单的就完成了,可以保存了*/
CLSID pngClsid;
/*GetEncoderClsid需要自己实现,将在下面给出*/
/*"image/bmp" 参数bmp是要保存的图片格式,可以换成png,jpeg等*/
GetEncoderClsid(L"image/bmp", &pngClsid);
bmp.Save(L"c:\\test.bmp", &pngClsid, NULL);
/*下面的方法是将bmp转换成unsigned char* */
void * outbuf;
size_t size = 0;
mi_to_memory( &bmp, &outbuf, &size );
/*
*outbuf即为bmp转化成的字符串,可以使用里面的数据,png是压缩过的,只能用bmp格式,其中文件的前54位是图
*片的格式信息,从55位开始是图片的数据信息,里面的数据可能不是按正常顺序排列的,有的是从上往下一行一行
*正常排列,有的是从下往上排列,在图片的格式信息中有标记。
*/
/*下面是用得到函数*/
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
|
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;
}
static
bool
stream_to_mem( IStream *stream,
void
**outbuf,
size_t
*size )
{
ULARGE_INTEGER ulnSize;
LARGE_INTEGER lnOffset;
lnOffset.QuadPart = 0;
/* get the stream size */
if
( stream->Seek( lnOffset, STREAM_SEEK_END, &ulnSize ) != S_OK )
{
return
false
;
}
if
( stream->Seek( lnOffset, STREAM_SEEK_SET, NULL ) != S_OK )
{
return
false
;
}
/* read it */
*outbuf =
malloc
( (
size_t
)ulnSize.QuadPart );
*size = (
size_t
) ulnSize.QuadPart;
ULONG
bytesRead;
if
( stream->Read( *outbuf, (
ULONG
)ulnSize.QuadPart, &bytesRead ) != S_OK )
{
free
( *outbuf );
return
false
;
}
return
true
;
}
void
*mi_to_memory( Gdiplus::Image *image,
void
**outbuf,
size_t
*size )
{
IStream *stream = NULL;
if
( ::CreateStreamOnHGlobal( NULL, TRUE, &stream ) != S_OK )
{
return
NULL;
}
/* get the jpg encoder */
::CLSID jpgClsid;
GetEncoderClsid( L
"image/bmp"
, &jpgClsid );
/* save the image to stream */
Gdiplus::Status save_s = image->Save( stream, &jpgClsid );
if
( save_s != Gdiplus::Ok )
{
stream->Release();
return
NULL;
}
/* read the stream to buffer */
if
( !stream_to_mem( stream, outbuf, size ) )
{
stream->Release();
return
NULL;
}
return
*outbuf;
}
|