保存前加一句 myImage2.SetResolution(300, 300) 你設(shè)置的bMape不是保存的主畫布 所以無(wú)效,設(shè)置分辨率就是 SetResolution(X,Y)
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到遵化網(wǎng)站設(shè)計(jì)與遵化網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋遵化地區(qū)。
默認(rèn)單位是像素
96是系統(tǒng)的一種設(shè)定,每英寸的點(diǎn)數(shù),是系統(tǒng)界面用小字體時(shí)的設(shè)置
用像素?cái)?shù)除以dpi沒(méi)有意義
粘貼個(gè)答案給你參考一下,請(qǐng)看一下代碼希望對(duì)你有所幫助:
'CommandBotton一個(gè)Picture控件一個(gè)
'把picture1的AutoSize屬性設(shè)為True
'用Picture里裝載那張你需要的圖片
'然后
Private Sub Command1_Click()
i = MsgBox("圖片的分辨率為:" + Str(Picture1.ScaleWidth / 15) + "X" + Str(Picture1.ScaleHeight / 15))
End Sub
你可以使用二次線形插值的方法:
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方向進(jìn)行縮放處理,結(jié)果保存在此中間數(shù)組內(nèi)
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 '要插值的目標(biāo)高度
Dim OutPutWid As Long '要插值的目標(biāo)寬度
Public TimeZoom As Long '插值運(yùn)算使用的時(shí)間
簡(jiǎn)單解釋一下關(guān)于二次線性插值算法。
(為了說(shuō)明算法本身,我們只計(jì)算這個(gè)圖片的紅色分量,因?yàn)榧t綠藍(lán)三種顏色的計(jì)算方法完全相同)
假設(shè)我們有一個(gè)很簡(jiǎn)單的圖片,圖片只有4個(gè)像素(2*2)
A B
C D
現(xiàn)在我們要把這個(gè)圖片插值到9個(gè)像素:3*3
A ab B
ac abcd bd
C cd D
其中大寫的字母代表原來(lái)的像素,小寫字母代表插值得到的新像素。
想必看到這個(gè)圖,大家心里已經(jīng)有了這個(gè)算法了。
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
推導(dǎo):
ab= A + (B-A) / 2
cd=C +(D-C) / 2
...
很簡(jiǎn)單,對(duì)吧,先從一個(gè)方向把只涉及兩個(gè)原始像素的新像素算出來(lái)。我們這里假定先計(jì)算水平方向。而在算垂直方向的插值的時(shí)候,因?yàn)閍b和cd已經(jīng)在前面算好了,所以abcd的計(jì)算也和計(jì)算ac和bd沒(méi)有任何區(qū)別了。
有可能為有朋友已經(jīng)想到把原來(lái)的圖像插值到4*4或5*5的方法了。
A ab1 ab2 B
ac1 ab1cd11 ab2cd21 bd1
ac2 ab1cd12 ab2cd22 bd2
C cd1 cd2 D
推導(dǎo):
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;然后每一個(gè)新的點(diǎn)就是在前面那個(gè)點(diǎn)的值加上這個(gè)遞增量就是了。
這里我們假設(shè)A=100, B=255 放大倍率為3,水平方向插值;先計(jì)算出原始像素的差:(B-A) = 255-100 =155
再計(jì)算出水平方向每一步的遞增量:(A-B) / 3=155 / 3 = 51.7
這里我們用一個(gè)變量DRt來(lái)記錄這個(gè)遞增量(這里只用紅色來(lái)做例子)
ab1 = A + DRt = 100+51.7 =151
ab2 = ab1 + DRt = 151+51.7 = 202
好了,其實(shí)二次線性算法就是這么一個(gè)東西,并不復(fù)雜?;蛟S有寫朋友會(huì)對(duì)于我給出的代碼產(chǎn)生疑問(wèn)。很簡(jiǎn)單的一個(gè)算法為什么要寫這么多代碼。
其實(shí)答案很簡(jiǎn)單:為了提高速度。
在VB中“+”和“-”永遠(yuǎn)是最快的,“*”要比“/”和“\”快。不論是什么類型的變量都是這樣的。
下面再來(lái)分析一下我的程序。
在我的程序中把兩個(gè)方向的插值分解成了兩個(gè)單獨(dú)的部分。
先把
A B
C D
變成:
A ab1...abN B
C cd1...cdN D
再變成:
A ab1...abN B
ac1 ............. db1
... ............ ...
acN .............. bdN
C cd1...cdN D
這兩個(gè)方向的插值算法完全相同
而Xratio 和Yratio 這兩個(gè)變量則用來(lái)記錄水平方向和垂直方向的放大倍率。所以這個(gè)過(guò)程也能夠讓圖像縮放不按照原始的縱橫比進(jìn)行。
好了,將這個(gè)模塊和全局變量添加到上次建立的工程模塊中。
把按鈕中的代碼改成:
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 學(xué)習(xí)中,絕對(duì)路徑就是指帶有盤符的固定的路徑,比如“c:\windows\systems\a.exe” 而相對(duì)路徑則可用APP.PATH連接文件名來(lái)表示,比如:App.Path "\a.exe"
以vb學(xué)習(xí)中加載圖片為例,這樣就容易弄明白了。假設(shè)我們要在vb中加載一幅圖片,假設(shè)我們把這個(gè)加載圖片的程序保存在如下位置:"E:\aa-vbnew\加載圖片講解"而我們的圖片在"D:\My Files\圖畫\tong.jpg"
那么情況如下:1,在代碼中直接以絕對(duì)路徑表示加載到form1中,如圖所示:
顯示結(jié)果如下:
2,換一種方式,以相對(duì)路徑直接加載也可以。程序如圖:
結(jié)果如上圖。
下面分析如下:
第一種方式,我們使用的是圖片的完整路徑,就稱之為絕對(duì)路徑,也就是說(shuō)不管我們的這個(gè)VB程序放到硬盤的任何位置,都完全可以顯示出來(lái)這幅圖片,因?yàn)閳D片的路徑是絕對(duì)的,只要不改變圖片的路徑,那么就是絕對(duì)不變的。
第二種方式,我們使用的是圖片的相對(duì)路徑,相對(duì)于誰(shuí)呢?是相對(duì)于我們的VB這個(gè)應(yīng)用程序和這幅圖片自身位置的。一旦我們的程序位置發(fā)生變化或者圖片的位置發(fā)生改變,那么這個(gè)程序都不可以執(zhí)行,不會(huì)顯示這幅圖片。所以說(shuō)這就是相對(duì)路徑,是以一個(gè)參考對(duì)象而存在的。
新聞標(biāo)題:vb.net高dpi,vbnet高級(jí)編程
轉(zhuǎn)載注明:http://chinadenli.net/article16/hophgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、商城網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容