• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-6-21 21:57 | 作者:   | 来源: 天极网  | 查看: 15次 | 进入软件测试论坛讨论

领测软件测试网

下一页 1 2 

   

  上次讲到了用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 \'插值运算使用的时间


 

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网