GDI+总结Word格式.docx
- 文档编号:22283833
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:25
- 大小:21.83KB
GDI+总结Word格式.docx
《GDI+总结Word格式.docx》由会员分享,可在线阅读,更多相关《GDI+总结Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
14.
size;
size,
in
bytes,
the
decoder
array
15.
16.
ImageCodecInfo*
pImageCodecInfo;
17.
18.
How
many
are
there?
19.
big
(in
bytes)
is
all
ImageCodecInfo
objects?
20.
GetImageDecodersSize(&
num,
size);
21.
22.
Create
a
buffer
large
enough
to
hold
23.
objects
that
will
be
returned
by
GetImageDecoders.
24.
pImageCodecInfo
=
(ImageCodecInfo*)(malloc(size));
25.
26.
GetImageDecoders
creates
an
27.
and
copies
into
previously
allocated
buffer.
28.
The
third
argument,
imageCodecInfos,
pointer
29.
GetImageDecoders(num,
pImageCodecInfo);
30.
31.
Display
graphics
file
format
(MimeType)
32.
for
each
object.
33.
for(UINT
j
0;
++j)
34.
{
35.
wprintf(L"
%s\n"
pImageCodecInfo[j].MimeType);
36.
}
37.
38.
free(pImageCodecInfo);
39.
GdiplusShutdown(gdiplusToken);
40.
return
41.}
Theprecedingcodeproducesthefollowingoutput:
image/bmp
image/jpeg
image/gif
image/x-emf
image/x-wmf
image/tiff
image/png
image/x-icon
仿照上例,我们编写自己的,获得编码格式的函数GetEncoderClsid()
1.INT
GetEncoderClsid(const
WCHAR
*format,
CLSID
*pClsid)
2.{
3.
num
encoders
4.
size
encoder
bytes
6.
NULL;
7.
GetImageEncodersSize(&
if(size
==
0)
-1;
Failure
if(pImageCodecInfo
NULL)
GetImageEncoders(num,
if(
wcscmp(pImageCodecInfo[j].MimeType,
format)
0
)
*pClsid
pImageCodecInfo[j].Clsid;
j;
Success
30.}
保存图像文件:
Example_1:
1.VOID
Example_SaveFile(HDC
hdc)
Graphics
graphics(hdc);
Image
object
based
on
PNG
file.
image(L"
Mosaic.png"
);
Draw
image.
graphics.DrawImage(&
image,
10,
10);
Construct
imageGraphics(&
image);
Alter
SolidBrush
brush(Color(255,
0,
255));
imageGraphics.FillEllipse(&
brush,
20,
30,
80,
50);
altered
200,
Save
pngClsid;
GetEncoderClsid(L"
image/png"
pngClsid);
image.Save(L"
Mosaic2.png"
pngClsid,
25.}
Example_2:
1.void
CMyView:
:
SavePic(HBITMAP
hBitmap,
CString
szPicFilePath)
if(!
hBitmap)
return;
if(PathFileExists(szPicFilePath))
CFile:
Remove(szPicFilePath);
BITMAP
bm;
GetObject(hBitmap,sizeof(BITMAP),&
bm);
WORD
BitsPerPixel=bm.bmBitsPixel;
using
Bitmap*
bitmap=Bitmap:
FromHBITMAP(hBitmap,NULL);
EncoderParameters
encoderParameters;
ULONG
compression;
clsid;
if(BitsPerPixel==1)
compression=EncoderValueCompressionCCITT4;
else
compression=EncoderValueCompressionLZW;
image/tiff"
clsid);
encoderParameters.Count=1;
encoderParameters.Parameter[0].Guid=EncoderCompression;
encoderParameters.Parameter[0].Type=EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues=1;
encoderParameters.Parameter[0].Value=&
bitmap->
Save(szPicFilePath,&
clsid,&
encoderParameters);
delete
bitmap;
/*
compression=100;
image/jpeg"
encoderParameters.Count
1;
41.
encoderParameters.Parameter[0].Guid
EncoderQuality;
42.
encoderParameters.Parameter[0].Type
EncoderParameterValueTypeLong;
43.
encoderParameters.Parameter[0].NumberOfValues
44.
encoderParameters.Parameter[0].Value
=&
45.
*/
46.}
GDI+总结二:
为什么说CImage类是基于GDI+的?
在许多资料上都说CImage类是基于GDI+的,但是为什么是基于GDI+的呢?
因为使用这个类时,并没有加入#include<
,也没有在程序开始和结束时分别写GDI+启动代码GdiplusStartupInput和结束代码GdiplusShutdown
使用这个类时,仅仅需要添加头文件#include<
altimage.h>
就可以了,比GDI+得使用要简单一些。
而CImage对图片的处理很类似GDI+,其内部是不是封装了GDI+呢?
幸好,CImage类是源码公开的,我们可以研究其源码,以便加深理解。
首先,看看altimage.h头文件
1.#ifndef
__ATLIMAGE_H__
2.#define
4.#pragma
once
6.#include
atldef.h>
7.#include
atlbase.h>
8.#include
atlstr.h>
9.#include
atlsimpcoll.h>
10.#include
atltypes.h>
12.#ifndef
_ATL_NO_PRAGMA_WARNINGS
13.#pragma
warning
(push)
14.#pragma
warning(disable
4820)
padding
added
after
member
15.#endif
//!
17.#pragma
warning(
push,
3
18.#pragma
push_macro("
new"
19.#undef
new
20.#include
注意这里:
添加了GDI+得头文件
21.#pragma
pop_macro("
22.#pragma
pop
24.#include
shlwapi.h>
26.#ifndef
_ATL_NO_DEFAULT_LIBS
27.#pragma
comment(lib,
"
gdi32.lib"
28.#pragma
shlwapi.lib"
29.#pragma
gdiplus.lib"
30.#if
WINVER
>
0x0500
31.#pragma
msimg32.lib"
32.#endif
33.#endif
!
35.#pragma
pack(push,
_ATL_PACKING)
上面包含了GDI+得头文件
再来看CImage的定义:
1.class
CImage
3.private:
class
CDCCache
public:
CDCCache()
throw();
~CDCCache()
HDC
GetDC()
void
ReleaseDC(
private:
m_ahDCs[CIMAGE_DC_CACHE_SIZE];
};
CInitGDIPlus
CInitGDIPlus()
~CInitGDIPlus()
bool
Init()
ReleaseGDIPlus()
IncreaseCImageCount()
DecreaseCImageCount()
m_dwToken;
CRITICAL_SECTION
m_sect;
LONG
m_nCImageObjects;
1.static
s_initGDIPlus;
s_cache;
它定义了两个类成员变量:
其中CInitGDIPlus是负责GDI+的启动和释放
我们再看一下,这个成员类的Init()方法:
1.inline
CImage:
CInitGDIPlus:
throw()
EnterCriticalSection(&
m_sect);
fRet
true;
m_dwToken
Gdiplus:
input;
GdiplusStartupOutput
output;
Status
status
GdiplusStartup(
m_dwToken,
input,
output
//启动GDI+
Ok
false;
LeaveCriticalSection(&
fRet;
15.}
也就是说使用这个函数启动GDI+
再看下一个函数:
GdiplusShutdown(
10.}
也就是说,使用这一个函数,用来关闭GDI+
到此,我们便可知道,CImage类是基于GDI+的,但是我们还不知道CImage对象是不是在初始化时就启动了GDI+?
如果不是,那什么时候才启动GDI+呢?
为解决这个疑惑,我们查看CImage构造函数
CImage()
2.
m_hBitmap(
NULL
),
m_pBits(
m_hDC(
m_nDCRefCount(
m_hOldBitmap(
m_nWidth(
m_nHeight(
m_nPitch(
m_nBPP(
m_iTransparentColor(
-1
m_bHasAlphaChannel(
false
m_bIsDIBSection(
14.{
s_initGDIPlus.IncreaseCImageCount();
16.}
m_nCImageObjects++;
6.}
由此可见,构造函数并没有启动GDI+
也就是说定义
CImageimage;
这个image变量时,并没有启动GDI+
我们继续查找:
InitGDIPlus()
throw(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GDI 总结