科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VB图像处理之二次线性插值的应用

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

图像插值放大的方法有很多,最主要的有二次线性插值和三次线性插值这两种

作者:WallesCai 来源:CSDN 2007年10月14日

关键字: VB 图像处理 二次线性插值

  • 评论
  • 分享微博
  • 分享邮件
上次讲到了用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 '插值运算使用的时间
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章