版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://vistaswx.blogbus.com/logs/41225905.html
VB自己的绘图语句都需要用LoadPicture载入图片,同样,GDI+中也需要。
1.载入(初始化)图片资源
(1)来自文件:GdipLoadImageFromFile
我们先来看看这个最简单基本的载入图片来自文件(只能看 不能运行 呵呵):
Dim img As Long, img_W As Long, img_H As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
GdipGetImageWidth img, img_W
GdipGetImageHeight img, img_H
'GdipDisposeImage img
当然 这里面载入长宽是可选的。
最后呢 别忘记释放Image,否则内存突然没了可不要找我~
(2)来自资源文件:GdipLoadImageFromStream
这个函数主要是用来从资源文件(RES)载入图像的,怎么载入呢?我们来看函数,函数是从Stream载入,但是我们VB6没有集成Stream对象,从RES读取出来(LoadResData)也只是返回Byte()。不过很好,OLE提供了一个函数能够将Byte()变为一个IStream对象——我们需要这个API
Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnRelease As Long, ByRef ppstm As Any)
示例代码:
Dim img As Long Dim ResData() As Byte, IStream As Object ResData = LoadResData(101, "CUSTOM") CreateStreamOnHGlobal ResData(0), False, IStream GdipLoadImageFromStream IStream, img Set IStream = Nothing 'GdipDisposeImage img
2.绘制图片
(1)GdipDrawImage(I) 【不推荐使用】
这是最普通的画法,不需要长宽设置 注意:它貌似不按原大小绘制!不推荐使用!。我们初始化GDI+省略……图片资源也省略(支持32位),来看这种GdipDrawImage(I)。(技巧:有I的记住了 坐标、长宽都是Long型 没有I的一般都是Single)
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImage graphics, img, 0, 0
(2)GdipDrawImageRect(I)【推荐】
这是第二高级的画法,我们可以对图片的大小进行改变(拉伸)
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImageRect graphics, img, 0, 0, 100, 200 '拉伸到100*200
(3)GdipDrawImageRectRect(I)
不要以为微软脑残了。这个可是很高级的画法。
首先通过它我们可以画一个图的一个部分 并且同样可以改变大小(好处:我们可以把所有的图片资源综合到一个图片中)
第二呢这个支持ImageAttribs图片“滤镜”:我们可以改变图片透明度和各种属性
接下来来看看这个的画法:
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImageRectRectI graphics, img, 20, 20, 10, 10, 0, 0, 100, 200, UnitPixel
注意咯 第三~第六个参数是原来图片中要截取的部分;第七~第十呢则是画到哪里以及画出来多大的设置。
(4)贴图刷
贴图刷子 跟其它刷子一样 我们需要创建刷子 另外我们需要先初始化图片:)
来看代码:
Dim img As Long, textureBrush As Long
GdipLoadImageFromFile StrPtr("C:\TestImage.png"), img
'此处请初始化GDI+以及graphics
GdipCreateTexture img, WrapModeTileFlipX, textureBrush
GdipFillRectangle graphics, textureBrush, 0, 0, 100, 100
贴图刷子跟其它刷子有什么区别呢?普通画法(DrawImage)支持的是拉伸,贴图刷则是平铺。另外贴图刷还要注意定位问题。因为贴图刷纹理起始点是0,0。因此不代表从任何位置画都可以画到正好的图片。
贴个图,直观明了。
那么贴图刷子中如何调整图片起始位置呢?我们可以平移图片——GdipTranslateTextureTransform。参数很简单 是平移量。(注意:这个我记得是参照之前量的,不是原图片;因此更改平移量要先Reset下:GdipResetTextureTransform)







评论