VB6.0中的抗锯齿算法

VB6.0中的抗锯齿算法

http://blog.csdn.net/laviewpbt/article/details/756564

1、采用SetPixel函数

抗锯齿算法,采用的是SetPixel函数,效率相对来说比较低下,应用DIB可以提高绘图效率,但在画少量的曲线时是看不出来差距的。(大部分代码是参考别人的)

'程序实现功能:抗锯齿算法
'作    者: laviewpbt
'联系方式: [email protected]
'QQ:33184777
'版本:Version 1.0.0
'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议


Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Long) As Long


'*************************************************************************
'**    作    者 :    Unknown
'**    函 数 名 :    PutPixelGP
'**    输    入 :    hDC(Long)        -   设备场景
'**             :    x(String)        -   点坐标
'**             :    y(Long)          -   点坐标
'**             :    Strength(Long)   -   长度
'**             :    Red(Long)        -   红色值
'**             :    Green(Long)      -   绿色值
'**             :    Blue(Long)       -   蓝色值
'**    输    出 :    无
'**    功能描述 :    画一个点
'**    日    期 :    2005-10-26 22.12.31
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 22.13.54
'**    版    本 :    Version 1.2.1
'*************************************************************************
Private Sub PutPixelGP(hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal Strength As Long, Red As Long, Green As Long, Blue As Long)
    Dim Color            As Long
    Dim bgColor          As Long
    Dim Rbg              As Long
    Dim Gbg              As Long
    Dim Bbg              As Long
    Dim Rblend           As Long
    Dim Gblend           As Long
    Dim Bblend           As Long
    Dim StrengthI        As Long
    If Strength > 252 Then
        SetPixelV hDC, X, Y, m_Color
    Else
        bgColor = GetPixel(hDC, X, Y)
        If bgColor Then
            Rbg = bgColor And &HFF&
            Gbg = (bgColor And &HFF00&) / &H100&
            Bbg = (bgColor And &HFF0000) / &H10000
        End If
        StrengthI = 255 - Strength
        Rblend = StrengthI * Rbg + Strength * Red
        Gblend = StrengthI * Gbg + Strength * Green
        Bblend = StrengthI * Bbg + Strength * Blue
        Color = RGB(Rblend / 256, Gblend / 256, Bblend / 256)
        SetPixelV hDC, X, Y, Color
    End If
End Sub

'*************************************************************************
'**    作    者 :    Unknown
'**    函 数 名 :    TranslateColour
'**    输    入 :    color(OLE_COLOR)  -   颜色值
'**             :    Red(Long)        -   红色值
'**             :    Green(Long)      -   绿色值
'**             :    Blue(Long)       -   蓝色值
'**    输    出 :    无
'**    功能描述 :    得到颜色分量
'**    日    期 :    2005-10-26 22.16.31
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 22.17.28
'**    版    本 :    Version 1.2.1
'*************************************************************************
Public Sub SetRGBComponents(ByVal Color As OLE_COLOR, Red As Long, Green As Long, Blue As Long)
    Color = TranslateColour(Color)
    m_Color = Color
   If Color Then
      Red = Color And &HFF&
      Green = Color / 256 And &HFF
      Blue = Color / 65536
   Else
      Red = 0
      Green = 0
      Blue = 0
   End If
End Sub

'*************************************************************************
'**    作    者 :    Unknown
'**    函 数 名 :    TranslateColour
'**    输    入 :    color(OLE_COLOR)  -   颜色值
'**             :    hPal(Long)        -   0
'**    输    出 :    无
'**    功能描述 :    颜色转换
'**    日    期 :    2005-10-26 22.15.23
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 22.16.54
'**    版    本 :    Version 1.2.1
'*************************************************************************
Private Function TranslateColour(ByVal clr As OLE_COLOR, Optional hPal As Long = 0) As Long
   If OleTranslateColor(clr, hPal, TranslateColour) Then
      TranslateColour = vbBlack
   End If
End Function

'*************************************************************************
'**    作    者 :    Unknown
'**    函 数 名 :    LineGP
'**    输    入 :    hDC(Long)        -   设备场景
'**             :    x1(String)       -   起始坐标(以象素为单位)
'**             :    y1(Integer)      -   起始坐标
'**             :    x2(Integer)      -   终点坐标
'**             :    y2(Integer)      -   终点坐标
'**             :    color(OLE_COLOR) -   颜色值
'**    输    出 :    无
'**    功能描述 :    抗锯齿算法划线
'**    日    期 :    2005-10-26 22.10.23
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 22.10.56
'**    版    本 :    Version 1.2.1
'*************************************************************************
Public Sub LineGP(ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal Color As OLE_COLOR)
    Dim Red              As Long
    Dim Green            As Long
    Dim Blue             As Long
    Dim XScope           As Long
    Dim YScope           As Long
    Dim XDir             As Long
    Dim YDir             As Long
    Dim LinearDeviance   As Long
    Dim Counter          As Long
    Dim AntiAliasStrength As Long
    Dim EndPointIntensity As Long
    Const HalfIntensity As Long = 127
    m_Color = Color
    XScope = X2 - X1
    YScope = Y2 - Y1
    If XScope < 0 Then
        XScope = Abs(XScope)
        XDir = -1
    Else
        XDir = 1
    End If
    If YScope < 0 Then
        YScope = Abs(YScope)
        YDir = -1
    Else
        YDir = 1
    End If
    If XScope + YScope = 0 Then   '如果长度为0,则退出
    Exit Sub
        End If
    SetRGBComponents Color, Red, Green, Blue
    If XScope > YScope Then
        EndPointIntensity = (85 * YScope) / XScope
        PutPixelGP hDC, X1 - XDir, Y1 - YDir, EndPointIntensity, Red, Green, Blue
        PutPixelGP hDC, X1 - XDir, Y1, HalfIntensity, Red, Green, Blue
        PutPixelGP hDC, X2 + XDir, Y2 + YDir, EndPointIntensity, Red, Green, Blue
        PutPixelGP hDC, X2 + XDir, Y2, HalfIntensity, Red, Green, Blue
        LinearDeviance = XScope / 2
        For Counter = 0 To XScope
            SetPixelV hDC, X1, Y1, m_Color
            AntiAliasStrength = (LinearDeviance * 255) / XScope
            PutPixelGP hDC, X1, Y1 - YDir, 255 - AntiAliasStrength, Red, Green, Blue
            PutPixelGP hDC, X1, Y1 + YDir, AntiAliasStrength, Red, Green, Blue
            LinearDeviance = (LinearDeviance + YScope)
            If LinearDeviance >= XScope Then
                LinearDeviance = LinearDeviance - XScope
                Y1 = Y1 + YDir
            End If
            X1 = X1 + XDir
        Next
    Else
        EndPointIntensity = (85 * XScope) / YScope
        PutPixelGP hDC, X1 - XDir, Y1 - YDir, EndPointIntensity, Red, Green, Blue
        PutPixelGP hDC, X1, Y1 - YDir, HalfIntensity, Red, Green, Blue
        PutPixelGP hDC, X2 + XDir, Y2 + YDir, EndPointIntensity, Red, Green, Blue
        PutPixelGP hDC, X2, Y2 + YDir, HalfIntensity, Red, Green, Blue
        LinearDeviance = YScope / 2
        For Counter = 0 To YScope
            SetPixelV hDC, X1, Y1, m_Color
            AntiAliasStrength = (LinearDeviance * 255) / YScope
            PutPixelGP hDC, X1 - XDir, Y1, 255 - AntiAliasStrength, Red, Green, Blue
            PutPixelGP hDC, X1 + XDir, Y1, AntiAliasStrength, Red, Green, Blue
            LinearDeviance = LinearDeviance + XScope
            If (LinearDeviance >= YScope) Then
                LinearDeviance = LinearDeviance - YScope
                X1 = X1 + XDir
            End If
            Y1 = Y1 + YDir
        Next
    End If

End Sub

 

2、采用GetDIBits


Public Declare Function GetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function SetDIBits Lib "gdi32" (ByVal hDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Type BITMAPINFOHEADER
    biSize               As Long
    biWidth              As Long
    biHeight             As Long
    biPlanes             As Integer
    biBitCount           As Integer
    biCompression        As Long
    biSizeImage          As Long
    biXPelsPerMeter      As Long
    biYPelsPerMeter      As Long
    biClrUsed            As Long
    biClrImportant       As Long
End Type

Public Type BITMAPINFO
    bmiHeader            As BITMAPINFOHEADER
End Type

 


'*************************************************************************
'**    作    者 :    unknown
'**    函 数 名 :    LineDIB
'**    输    入 :    x1(String)           -   起始坐标
'**             :    y1(Integer)          -   起始坐标
'**             :    x2(Integer)          -   终点坐标
'**             :    y2(Integer)          -   终点坐标
'**             :    Color(OLE_COLOR) -   前景颜色
'**    输    出 :    无
'**    功能描述 :    DIB插值
'**    日    期 :    2005-10-26 23.57.12
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 23.57.45
'**    版    本 :    Version 1.2.1
'*************************************************************************
Public Sub LineDIB(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal Color As OLE_COLOR)
    If Not InDIBits Then
        MsgBox "You must create a DIB array before calling LineDIB."
        Exit Sub
    End If
    Dim Red As Long
    Dim Green As Long
    Dim Blue As Long
    Dim XScope           As Long
    Dim YScope           As Long
    Dim XDir             As Long
    Dim YDir             As Long
    Dim LinearDeviance   As Long
    Dim Counter          As Long
    Dim AntiAliasStrength As Long
    Dim EndPointIntensity As Long
    Const HalfIntensity As Long = 127
    XScope = X2 - X1
    YScope = Y2 - Y1
    If XScope < 0 Then
        XScope = Abs(XScope)
        XDir = -1
    Else
        XDir = 1
    End If
    
    If YScope < 0 Then
        YScope = Abs(YScope)
        YDir = -1
    Else
        YDir = 1
    End If
    If XScope + YScope = 0 Then
        Exit Sub
    End If
    SetRGBComponents Color, Red, Green, Blue
    If XScope > YScope Then
        EndPointIntensity = (85 * YScope) / XScope
        PutPixelDIB X1 - XDir, Y1 - YDir, EndPointIntensity, Red, Green, Blue
        PutPixelDIB X1 - XDir, Y1, HalfIntensity, Red, Green, Blue
        PutPixelDIB X2 + XDir, Y2 + YDir, EndPointIntensity, Red, Green, Blue
        PutPixelDIB X2 + XDir, Y2, HalfIntensity, Red, Green, Blue
        LinearDeviance = XScope / 2
        For Counter = 0 To XScope
            PutPixelDIB X1, Y1, 255, Red, Green, Blue
            AntiAliasStrength = (LinearDeviance * 255) / XScope
            PutPixelDIB X1, Y1 - YDir, 255 - AntiAliasStrength, Red, Green, Blue
            PutPixelDIB X1, Y1 + YDir, AntiAliasStrength, Red, Green, Blue
            LinearDeviance = (LinearDeviance + YScope)
            If LinearDeviance >= XScope Then
                LinearDeviance = LinearDeviance - XScope
                Y1 = Y1 + YDir
            End If
            X1 = X1 + XDir
        Next
    Else
        EndPointIntensity = (85 * XScope) / YScope
        PutPixelDIB X1 - XDir, Y1 - YDir, EndPointIntensity, Red, Green, Blue
        PutPixelDIB X1, Y1 - YDir, HalfIntensity, Red, Green, Blue
        PutPixelDIB X2 + XDir, Y2 + YDir, EndPointIntensity, Red, Green, Blue
        PutPixelDIB X2, Y2 + YDir, HalfIntensity, Red, Green, Blue
        LinearDeviance = YScope / 2
        For Counter = 0 To YScope
            PutPixelDIB X1, Y1, 255, Red, Green, Blue
            AntiAliasStrength = (LinearDeviance * 255) / YScope
            PutPixelDIB X1 - XDir, Y1, 255 - AntiAliasStrength, Red, Green, Blue
            PutPixelDIB X1 + XDir, Y1, AntiAliasStrength, Red, Green, Blue
            LinearDeviance = LinearDeviance + XScope
            If (LinearDeviance >= YScope) Then
                LinearDeviance = LinearDeviance - YScope
                X1 = X1 + XDir
            End If
            Y1 = Y1 + YDir
        Next
    End If
    
End Sub

 

 
 
'*************************************************************************
'**    作    者 :    unknown
'**    函 数 名 :    PutPixelDIB
'**    输    入 :    x(String)        -   点坐标
'**             :    y(Long)          -   点坐标
'**             :    Strength(Long)   -   长度
'**             :    Red(Long)        -   红色值
'**             :    Green(Long)      -   绿色值
'**             :    Blue(Long)       -   蓝色值
'**    输    出 :    无
'**    功能描述 :    DIB画一个点
'**    日    期 :    2005-10-26 22.12.31
'**    修 改 人 :    laviewpbt
'**    日    期 :    2005-10-26 22.13.54
'**    版    本 :    Version 1.2.1
'*************************************************************************
Private Sub PutPixelDIB(ByVal X As Long, ByVal Y As Long, ByVal Strength As Long, Red As Long, Green As Long, Blue As Long)
    Dim Rbg              As Long
    Dim Gbg              As Long
    Dim Bbg              As Long
    Dim StrengthI        As Long
    If X < 0 Or X >= m_W1 Or Y < 0 Or Y > m_H1 Then
        Exit Sub
    End If
    If Strength > 252 Then
        buf(X, Y).Blue = Blue
        buf(X, Y).Green = Green
        buf(X, Y).Red = Red
    Else
        Bbg = buf(X, Y).Blue
        Gbg = buf(X, Y).Green
        Rbg = buf(X, Y).Red
        StrengthI = 255 - Strength
        buf(X, Y).Red = (StrengthI * Rbg + Strength * Red) / 256
        buf(X, Y).Green = (StrengthI * Gbg + Strength * Green) / 256
        buf(X, Y).Blue = (StrengthI * Bbg + Strength * Blue) / 256
    End If
End Sub

 

'*************************************************************************
'**    作    者 :    unknown
'**    函 数 名 :    DIB
'**    输    入 :    hdc(Long)      -   设备句柄
'**             :    Handle(Long)   -   位图句柄
'**             :    W1(Long)       -   宽度
'**             :    H1(Long)       -   高度
'**    输    出 :    无
'**    功能描述 :    初试化一个DIB
'**    日    期 :    2005-10-26 0.03.25
'**    修 改 人 :
'**    日    期 :
'**    版    本 :    Version 1.2.1
'*************************************************************************

Public Sub DIB(ByVal hDC As Long, ByVal Handle As Long, ByVal W1 As Long, ByVal H1 As Long)
   m_hDC = hDC
   m_Handle = Handle
   m_W1 = W1
   m_H1 = H1
   Pic2Array
End Sub


'*************************************************************************
'**    作    者 :    unknown
'**    函 数 名 :    Pic2Array
'**    输    入 :    无
'**    输    出 :    无
'**    功能描述 :    得到DIB数据
'**    日    期 :    2005-10-26 0.00.00
'**    修 改 人 :
'**    日    期 :
'**    版    本 :    Version 1.2.1
'*************************************************************************
Private Sub Pic2Array()
   ReDim buf(0 To (m_W1 - 1), m_H1 - 1) As RGBQUAD
   With Binfo.bmiHeader
      .biSize = 40
      .biWidth = m_W1
      .biHeight = -m_H1
      .biPlanes = 1
      .biBitCount = 32
      .biCompression = 0
      .biClrUsed = 0
      .biClrImportant = 0
      .biSizeImage = m_W1 * m_H1
   End With
   GetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
   InDIBits = True
End Sub

'*************************************************************************
'**    作    者 :    unknown
'**    函 数 名 :    Array2Pic
'**    输    入 :    无
'**    输    出 :    无
'**    功能描述 :    显示并释放资源
'**    日    期 :    2005-10-26 0.00.50
'**    修 改 人 :
'**    日    期 :
'**    版    本 :    Version 1.2.1
'*************************************************************************
Public Sub Array2Pic()
    If InDIBits Then
        SetDIBits m_hDC, m_Handle, 0, m_H1, buf(0, 0), Binfo, DIB_RGB_COLORS
        InDIBits = False
        Erase buf()
    End If
End Sub

效果图:
  


猜你喜欢

转载自blog.csdn.net/lihongmao5911/article/details/44031085