Pegasus的ImagXpress 8.0控件,支持各种格式文件的加载。控件封装了右键局部区域放大的功能,要实现图片的缩放,把AutoResize属性设置为PegasusImaging.WinForms.ImagXpress8.AutoResizeType.CropImage,修改 ZoomFactor的值就可以了。
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、网站建设、荥阳网络推广、小程序设计、荥阳网络营销、荥阳企业策划、荥阳品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供荥阳建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
实现代码如下:
Dim img As Image = Image.FromFile("D:\Image\tstImage.jpg") 'tstImage是原先的图片
Dim grfx As Graphics = Me.CreateGraphics
grfx.DrawImage(img, 0, 0, img.Width * 3, img.Height * 3) '在Form里显示
Dim imgnew As New System.Drawing.Bitmap(img, img.Height * 3, img.Width * 3) '新建一个放大的图片
imgnew.Save("D:\Image\tstNewImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) '保存放大后图片
你可以建一个Form,然后在Form里拖进一个Button,把上面的代码放在Button_Click事件里面,执行就行了。
对上面代码的解释:
1.要获取Graphics对象只能从某一事件的参数中获取或者使用窗体和控件对象的CreateGraphics方法来获取-----上面代码使用Me.CreateGraphics来引用这个对象。
2.加载一个图片用Image类的FromFile或者FromStream方法
3.用DrawImage来显示一个图片,该方法有30多个重载方法,可以查MSDN了解细节。
4.保存时的一个问题:我们必须先建一个对象,用于存缩放图像。
。net 不用api就行
缩放操作
Function 缩放(ByVal bitmap As Bitmap, ByVal 倍数 As Single) As Bitmap
Dim w As Integer = bitmap.Width * 倍数
Dim h As Integer = bitmap.Height * 倍数
Dim tem As New Bitmap(w, h)
Dim g As Graphics = Graphics.FromImage(tem)
g.DrawImage(bitmap, New Rectangle(0, 0, w, h), New Rectangle(0, 0, bitmap.Width, bitmap.Height), GraphicsUnit.Pixel)
g.Dispose()
Return tem
End Function
鼠标滚轮事件 MouseWheel
MouseEventArgs.Delta 值可以判断滚动方向
你可以使用二次线形插值的方法:
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 '插值运算使用的时间
简单解释一下关于二次线性插值算法。
(为了说明算法本身,我们只计算这个图片的红色分量,因为红绿蓝三种颜色的计算方法完全相同)
假设我们有一个很简单的图片,图片只有4个像素(2*2)
A B
C D
现在我们要把这个图片插值到9个像素:3*3
A ab B
ac abcd bd
C cd D
其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。
想必看到这个图,大家心里已经有了这个算法了。
ab=(A+B) / 2
cd=(C+D) / 2
ac=(A+C) / 2
bd=(B+D) / 2
abcd=(ab+cd) / 2=(A+B+C+D) / 4
推导:
ab= A + (B-A) / 2
cd=C +(D-C) / 2
...
很简单,对吧,先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向。而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。
有可能为有朋友已经想到把原来的图像插值到4*4或5*5的方法了。
A ab1 ab2 B
ac1 ab1cd11 ab2cd21 bd1
ac2 ab1cd12 ab2cd22 bd2
C cd1 cd2 D
推导:
ab1 = A + (B-A) * 1 / 3
ab2 = A + (B-A) * 2 / 3 =ab1+(B-A) / 3
cd1 = C + (D-C) * 1 / 3
cd1 = C + (D-C) * 2 / 3 =cd1+(D-C) / 3
...
以A和B为例,先求出原始像素的差(A-B)再算出每一步的递增量(A-B) / 3;然后每一个新的点就是在前面那个点的值加上这个递增量就是了。
这里我们假设A=100, B=255 放大倍率为3,水平方向插值;先计算出原始像素的差:(B-A) = 255-100 =155
再计算出水平方向每一步的递增量:(A-B) / 3=155 / 3 = 51.7
这里我们用一个变量DRt来记录这个递增量(这里只用红色来做例子)
ab1 = A + DRt = 100+51.7 =151
ab2 = ab1 + DRt = 151+51.7 = 202
好了,其实二次线性算法就是这么一个东西,并不复杂。或许有写朋友会对于我给出的代码产生疑问。很简单的一个算法为什么要写这么多代码。
其实答案很简单:为了提高速度。
在VB中“+”和“-”永远是最快的,“*”要比“/”和“\”快。不论是什么类型的变量都是这样的。
下面再来分析一下我的程序。
在我的程序中把两个方向的插值分解成了两个单独的部分。
先把
A B
C D
变成:
A ab1...abN B
C cd1...cdN D
再变成:
A ab1...abN B
ac1 ............. db1
... ............ ...
acN .............. bdN
C cd1...cdN D
这两个方向的插值算法完全相同
而Xratio 和Yratio 这两个变量则用来记录水平方向和垂直方向的放大倍率。所以这个过程也能够让图像缩放不按照原始的纵横比进行。
好了,将这个模块和全局变量添加到上次建立的工程模块中。
把按钮中的代码改成:
sub command1_click()
With picture1
.ScaleMode=3
.BorderStyle=0
DibGet .hdc ,0 , 0 , .scalewidth , .scaleheight
ZoomImage , .scalewidth * 2 , .scaleheight * 2
End With
picture2.AutoRedraw=True
DibPut picture2.hdc
picture2.refresh
end sub
分享题目:vb点虐
dpi缩放 vb做图片放大缩小代码
路径分享:https://www.cdcxhl.com/article24/ddehoje.html
成都网站建设公司_创新互联,为您提供品牌网站设计、网站收录、定制网站、网站设计公司、网站导航、标签优化
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联