VB图像处理之二次线性插值的应用

2008-02-23 06:48:10来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

   上次讲到了用DIB方法来获取图像的像素。从这次开始将如果运用已经得到的像素来处理图像。

   图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种。这次我把自己的程序中所用的二次线性插值的算法公布给大家,希望对各位要使用VB写类似程序的朋友有所帮助。

   程序中用到的API、数据类型、全局变量的定义请参考上一篇:《 VB实现图像在数据库的存储与显示 》

Public Sub ZoomImage(ByVal OutPutWidth As Long, ByVal OutputHeight As Long)
  Dim I As Long
  Dim L As Long
  Dim X As Long
  Dim Y As Long
  Dim Xb As Long
  Dim Yb As Long
  Dim Xe As Long
  Dim Ye As Long
  Dim M As Integer
  Dim N As Integer
  Dim CurR As Long
  Dim CurG As Long
  Dim CurB As Long
  Dim NxtR As Integer
  Dim NxtG As Integer
  Dim NxtB As Integer
  Dim DR As Single
  Dim DG As Single
  Dim DB As Single
  Dim DRt As Single
  Dim DGt As Single
  Dim DBt As Single
  Dim Xratio As Single
  Dim Yratio As Single
  Dim CurStep As Single
  Dim NxtStep As Single
  Dim NegN As Single

  On Error GoTo ErrLine
  If Not CanZoom Then Exit Sub
  Done = False

  OutPutWid = OutPutWidth - 1
  OutPutHei = OutputHeight - 1
  I = (Bits \ 8) - 1
  ReDim ColTmp(I, InPutWid, OutPutHei) '先从Y方向进行缩放处理,结果保存在此中间数组内
  ReDim ColOut(I, OutPutWid, OutPutHei)
  Xratio = OutPutWid / InPutWid
  Yratio = OutPutHei / InPutHei

  TimeZoom = timeGetTime

  NegN = 1 / Int(Yratio 1)
  For X = 0 To InPutWid
   CurR = ColVal(0, X, 0)
   CurG = ColVal(1, X, 0)
   CurB = ColVal(2, X, 0)
   CurStep = 0
   NxtStep = 0
   For Y = 0 To InPutHei - 1
    NxtStep = CurStep Yratio
    Yb = CurStep
    Ye = NxtStep
    N = Ye - Yb
    ColTmp(0, X, Yb) = CurR
    ColTmp(1, X, Yb) = CurG
    ColTmp(2, X, Yb) = CurB
    M = Y 1
    NxtR = ColVal(0, X, M)
    NxtG = ColVal(1, X, M)
    NxtB = ColVal(2, X, M)
    If N > 1 Then
     DRt = (NxtR - CurR) * NegN
     DGt = (NxtG - CurG) * NegN
     DBt = (NxtB - CurB) * NegN
     DR = 0
     DG = 0
     DB = 0
     For L = Yb 1 To Ye - 1
      DR = DR DRt
      DG = DG DGt
      DB = DB DBt
      ColTmp(0, X, L) = CurR DR
      ColTmp(1, X, L) = CurG DG
      ColTmp(2, X, L) = CurB DB
     Next
    End If
    CurStep = NxtStep
    CurR = NxtR
    CurG = NxtG
    CurB = NxtB
   Next
   ColTmp(0, X, OutPutHei) = NxtR
   ColTmp(1, X, OutPutHei) = NxtG
   ColTmp(2, X, OutPutHei) = NxtB
  Next

  NegN = 1 / Int(Xratio 1)
  For Y = 0 To OutPutHei
   CurR = ColTmp(0, 0, Y)
   CurG = ColTmp(1, 0, Y)
   CurB = ColTmp(2, 0, Y)
   CurStep = 0
   NxtStep = 0
   For X = 0 To InPutWid - 1
    NxtStep = CurStep Xratio
    Xb = CurStep
    Xe = NxtStep
    N = Xe - Xb
    ColOut(0, Xb, Y) = CurR
    ColOut(1, Xb, Y) = CurG
    ColOut(2, Xb, Y) = CurB
    M = X 1
    NxtR = ColTmp(0, M, Y)
    NxtG = ColTmp(1, M, Y)
    NxtB = ColTmp(2, M, Y)
    If N > 1 Then
     DRt = (NxtR - CurR) * NegN
     DGt = (NxtG - CurG) * NegN
     DBt = (NxtB - CurB) * NegN
     DR = 0
     DG = 0
     DB = 0
     For L = Xb 1 To Xe - 1
      DR = DR DRt
      DG = DG DGt
      DB = DB DBt
      ColOut(0, L, Y) = CurR DR
      ColOut(1, L, Y) = CurG DG
      ColOut(2, L, Y) = CurB DB
     Next
    End If
    CurStep = NxtStep
    CurR = NxtR
    CurG = NxtG
    CurB = NxtB
   Next
   ColOut(0, OutPutWid, Y) = NxtR
   ColOut(1, OutPutWid, Y) = NxtG
   ColOut(2, OutPutWid, Y) = NxtB
  Next

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:利用 microsoft internet transfer control 下载文件

下一篇:Visual Basic COM基础讲座之兼容性