手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>VB>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
   上次讲到了用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

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!