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