手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

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

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机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

 Done = True
 TimeZoom = timeGetTime - TimeZoom
 CanPut = True
 Exit Sub
ErrLine:
 MsgBox Err.Description
End Sub
  全局变量定义:

Dim ColTmp() As Byte '用于保存插值中间变量
Dim OutPutHei As Long '要插值的目标高度
Dim OutPutWid As Long '要插值的目标宽度
Public TimeZoom As Long '插值运算使用的时间
  简单解释一下关于二次线性插值算法。

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