已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
vb运用Gdi+ 函数绘制任意四边形图像vb运用Gdi+实现矩形、平行四边形图像很容易。如果要绘制任意四边形图像就不是一件容易的事,因为在Gdi+中没有具体实现的函数。究竟能不能实现呢?答案是肯定的。我把它封装成一个方法,代码如下:绘制任意四边形图像函数Public Sub ImgAnyRectI(ByVal graphics As Long, ByVal bitmap As Long, pot() As POINTL, count As Integer) Dim Bitmap2 As Long Dim gBmp As Long Dim pox(3) As Variant Dim poy(3) As Variant Dim pos(3) As POINTL Dim newW As Long Dim newH As Long Dim i As Long Dim ky1 As Single Dim ky2 As Single For i = 0 To 3 pox(i) = pot(i).X poy(i) = pot(i).Y Next QSortAny pox, 0, 3 QSortAny poy, 0, 3 newW = pox(3) - pox(0) newH = poy(3) - poy(0) GdipCreateBitmapFromScan0 newW, newH, 0, GpPixelFormat.PixelFormat32bppARGB, ByVal 0, Bitmap2 GdipGetImageGraphicsContext Bitmap2, gBmp GdipGraphicsClear gBmp, &HFFFFFF GdipDrawImageRectI gBmp, bitmap, 0, 0, newW, newH ky1 = pot(3).Y - pot(0).Y ky2 = pot(2).Y - pot(1).Y For i = 0 To newH - 1 pos(0).Y = ky1 * i / newH + pot(0).Y pos(0).X = (pos(0).Y - pot(0).Y) * (pot(0).X - pot(3).X) / (pot(0).Y - pot(3).Y) + pot(0).X pos(1).Y = ky2 * i / newH + pot(1).Y pos(1).X = (pos(1).Y - pot(1).Y) * (pot(1).X - pot(2).X) / (pot(1).Y - pot(2).Y) + pot(1).X pos(2).Y = ky1 * (i + 2) / newH + pot(0).Y pos(2).X = (pos(2).Y - pot(0).Y) * (pot(0).X - pot(3).X) / (pot(0).Y - pot(3).Y) + pot(0).X GdipDrawImagePointsRectI graphics, Bitmap2, pos(0), 3, 0, i, newW, 1, UnitPixel Next GdipDisposeImage Bitmap2 GdipDeleteGraphics gBmp End Sub快速排序(升序)Public Sub QSortAny(Arr As Variant, Low As Long, Hi As Long) If Not IsArray(Arr) Then Exit Sub On Error GoTo QuickSort Dim l As Long Dim h As Long Dim M As Variant Dim V As Variant l = Low h = Hi If Hi = Low Then Exit Sub M = Arr(Int(Low + Hi) 2) Do While (l = h) While Arr(l) M: l = l + 1: Wend While M Arr(h): h = h - 1: Wend If (l = h) Then V = Arr(l): Arr(l) = Arr(h) Arr(h) = V l = l + 1: h = h - 1 End If Loop If (Low h) Then QSortAny Arr, Low, h If (l Hi) Then QSortAny Arr, l, Hi Exit SubQuickSort: MsgBox Err.descriptionEnd Sub下面详细解释实现的思路。在Gdi+函数中有一个函数 GdipDrawImagePointsRectI 他能帮我们实现任意四边形图像绘制,它是绘制任意四边形图像的核心函数。绘制任意四边形图像函数中用到的其它函数,如下:QSortAny数组排序(这不是Gdi+函数是我封装的一个函数)GdipCreateBitmapFromScan0用于在内存中创建一副图片GdipGetImageGraphicsContext用于从内存中图片在内存中创建画布GdipGraphicsClear用于设置画布背景完全透明GdipDrawImageRectI用于在内存画布上绘制矩形图像GdipDisposeImage 用于删除内存中的图像 GdipDeleteGraphics用于删除内存中的画布要绘制任意四边形图像,矩形图像无法一次绘制出整个任意四边形图像。要把矩形图像切割成1-2个像素高,宽与矩形图像宽相等的图片,对于每一个图片进行拉伸变形后,绘制到目标的相应位置,全部完成后整个任意四边形图像就绘制出来了,为避免闪烁要在内存中绘制,再把内存中这个图像一次性绘制到屏幕上,这就是我们要的任意四边形图像。这里有一个问题需要注意,我们先来看一副图片。其中,ABCD 矩形是abcd 任意四边形外接矩形,我们在内存中绘制ABCD 矩形大小的图像,abcd 任意四边形是我们要绘制的图像,AB边对应ab边,BC边对应bc边,CD边对应cd边,DA边对应da边。我们把ABCD矩形图像,从上到下进行切割。利用循环很容易做到,每次增加一个像素,DA边有多少像素高,就把图像切割成多少个图片,因为da边可能比DA边要长,但da边不可能大于DA的2倍,所以把每一个图片的高设置为2像素,使图片有一个像素的重复,这样就避免了露白现象。如何根据在DA边上的位置计算出在da边相应位置呢?在DA边上任取一点Q,那么在da边上相应的点q=AQ*(daH/DA)(注:其中daH是从a点到d点的高度,不是da的长度),同理可计算出在bc边中的相应位置。绘制任意四边形图像函数ImgAnyRectI(ByVal graphics As Long, ByVal bitmap As Long, pot() As POINTL, count As Integer)参数说明:graphics画布bitmap图片pot()数组,任意四边形顶点坐标(从左上角开始,顺时针次序),数据类型:POINTL结构类型count顶点个数,4个完整代码如下: (请自行添加Gdi+函数模块)窗体模块代码:Option ExplicitPrivate Sub Form_Load()Dim bitmap As LongDim graphics As LongDim pot(3) As POINTLMe.ClsMe.AutoRedraw = TrueMe.ScaleMode = 3 InitGDIPlus GdipCreateFromHDC Me.hdc, graphics App.Path & 002.jpg 换成你的图片路径 GdipCreateBitmapFromFile StrPtr(App.Path & 002.jpg), bitmap设置任意四边形顶点坐标(左上角开始顺时针次序),但最好要是凸任意四边形 pot(0).X = 300 pot(0).Y = 100 pot(1).X = 900 pot(1).Y = 300 pot(2).X = 1000 pot(2).Y = 600 pot(3).X = 100 pot(3).Y = 700 ImgAnyRectI graphics, bitmap, pot, 4 GdipDeleteGraphics graphics GdipDisposeImage bitmap Me.RefreshEnd Sub标准模块代码:Option Explicit绘制任意四边形图像函数Public Sub ImgAnyRectI(ByVal graphics As Long, ByVal bitmap As Long, pot() As POINTL, count As Integer) Dim Bitmap2 As Long Dim gBmp As Long Dim pox(3) As Variant Dim poy(3) As Variant Dim pos(3) As POINTL Dim newW As Long Dim newH As Long Dim i As Long Dim ky1 As Single Dim ky2 As Single For i = 0 To 3 pox(i) = pot(i).X poy(i) = pot(i).Y Next找出四顶点坐标的最大值和最小值 QSortAny pox, 0, 3 QSortAny poy, 0, 3以任意四边形外接矩形确定内存中图像大小 newW = pox(3) - pox(0) newH = poy(3) - poy(0) GdipCreateBitmapFromScan0 newW, newH, 0, GpPixelFormat.PixelFormat32bppARGB, ByVal 0, Bitmap2 GdipGetImageGraphicsContext Bitmap2, gBmp GdipGraphicsClear gBmp, &HFFFFFF GdipDrawImageRectI gBmp, bitmap, 0, 0, newW, newH ky1 = pot(3).Y - pot(0).Y ky2 = pot(2).Y - pot(1).Y For i = 0 To newH - 1 pos(0).Y = ky1 * i / newH + pot(0).Y pos(0).X = (pos(0).Y - pot(0).Y) * (pot(0).X - pot(3).X) / (pot(0).Y - pot(3).Y) + pot(0).X pos(1).Y = ky2 * i / newH + pot(1).Y pos(1).X = (pos(1).Y - pot(1).Y) * (pot(1).X - pot(2).X) / (pot(1).Y - pot(2).Y) + pot(1).X pos(2).Y = ky1 * (i + 2) / newH + pot(0).Y pos(2).X = (pos(2).Y - pot(0).Y) * (pot(0).X - pot(3).X) / (pot(0).Y - pot(3).Y) + pot(0).X GdipDrawImagePointsRectI graphics, Bitmap2, pos(0), 3, 0, i, newW, 1, UnitPixel Next GdipDisposeImage Bitmap2 GdipDeleteGraphics gBmp End Sub快速排序(升序)Public Sub QSortAny(Arr As Variant, Low As Long, Hi As Long) If Not IsArray(Arr) Then Exit Sub On Error GoTo QuickSort Dim l As Long Dim h As Long Dim M As Variant Dim V As Variant l = Low h = Hi If Hi = Low Then Exit Sub M = Arr(Int(Low + Hi) 2) Do While (l = h) While Arr(l) M: l = l + 1: W
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货运代办业务员安全知识宣贯能力考核试卷含答案
- 穿经工安全实践强化考核试卷含答案
- 传声器装调工安全知识宣贯评优考核试卷含答案
- 生化检验员安全生产基础知识测试考核试卷含答案
- 人造石生产加工工操作知识测试考核试卷含答案
- 巧克力塑形师诚信品质能力考核试卷含答案
- 船闸及升船机运管员道德能力考核试卷含答案
- 矿车修理工班组建设模拟考核试卷含答案
- 制胚剖片工持续改进评优考核试卷含答案
- 2026班组管理开放性面试题及答案
- AutoCAD 2016基础与应用案例教程
- 2026年绿色工厂数字化能碳管理平台建设方案
- 初级护工考试试题及答案
- 保密人员工作考核制度
- 人民调解枫桥经验培训课件
- 餐饮提升销售方案
- 人民医院档案管理制度
- 循环性休克及血流动力学监测概览
- 2025年重庆市初中生物学业水平考试试卷试题(含答案解析)
- 疼痛的评估与护理措施
- 老年患者跌倒预防与安全管理
评论
0/150
提交评论