VB中使用GDI+进行图像缩放的实例

VISUAL BASIC(VB)对图形图像的处理一直以来是弱项,并受到很多人的垢病。关于图形图像的放大缩小,一般使用PICTUREBox的PAINTPICTURE方法来处理。但这个处理方法最大的问题就是图像的失真。比方说图像中原来有网格线的,处理以后网格线会丢失,处理效果不好。后来在网上找到几个材料,是关于GDI+的用法的。试验了一下,果然效果非凡。以下为程序处理的关键代码

Private Type GdiplusstartupInput
    Gdiplusversion As Long
    DebugEventCallback As Long
    SuppressBackgroundThread As Long                                      
    SuppressExternalCodecs As Long
End Type
Private Enum GpStatus  'Status
    Ok = 0
    GenericError = 1
    InvalidParameter = 2
    OutOfMemory = 3
    ObjectBusy = 4
    InsufficientBuffer = 5
    NotImplemented = 6
    Win32Error = 7
    WrongState = 8
    Aborted = 9
    FileNotFound = 10
    ValueOverflow = 11
    AccessDenied = 12
    UnkNownImageFormat = 13
    FontFamilyNotFound = 14
    FontStyleNotFound = 15
    NottrueTypeFont = 16
    UnsupportedGdiplusversion = 17
    Gdiplusnotinitialized = 18
    PropertyNotFound = 19
    PropertyNotSupported = 20
End Enum
Private Declare Function Gdiplusstartup Lib "gdiplus" (token As Long,inputbuf As GdiplusstartupInput,Optional ByVal outputbuf As Long = 0) As GpStatus
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As GpStatus
Private Declare Function GdipDrawImageRect Lib "gdiplus" (ByVal graphics As Long,ByVal Image As Long,ByVal X As Single,ByVal Y As Single,ByVal Width As Single,ByVal Height As Single) As GpStatus
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hDC As Long,graphics As Long) As GpStatus
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As GpStatus
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String,Image As Long) As GpStatus
Private Declare Function GdipdisposeImage Lib "gdiplus" (ByVal Image As Long) As GpStatus
Dim gdip_Token As Long
Dim gdip_Image As Long
Dim gdip_Graphics As Long
'--------------------------------------
'-- 使用者请保留作者版权
'--  作者:BEAR-BEN
'--  QQ:453628001
'--------------------------------------
'-------------缩略图函数-----------
Public Sub ShowTNImg(PBox As Object,ImagePath As String,WidthMax As Long,HeightMax As Long)
    LoadGDIP
    If GdipCreateFromHDC(PBox.hDC,gdip_Graphics) <> 0 Then
        MsgBox "出现错误!",vbCritical,"错误"
        GdiplusShutdown gdip_Token
        End
    End If
    '载入图片到内存中
    GdipLoadImageFromFile StrConv(ImagePath,vbUnicode),gdip_Image
    '使用GDI+直接从内存中缩略并绘图,GDI+有很好的反锯齿能力
    If GdipDrawImageRect(gdip_Graphics,gdip_Image,WidthMax,HeightMax) <> Ok Then Debug.Print "显示失败。。。"
    disposeGDIP
End Sub
Public Sub LoadGDIP()
    Dim GpInput As GdiplusstartupInput
    GpInput.Gdiplusversion = 1
    If Gdiplusstartup(gdip_Token,GpInput) <> 0 Then
        MsgBox "加载GDI+失败!","加载错误"
        End
    End If
End Sub
Public Sub disposeGDIP()
    GdipdisposeImage gdip_Image
    GdipDeleteGraphics gdip_Graphics
    GdiplusShutdown gdip_Token
End Sub

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...