图片缩放自适应
按圖片比例預覽圖片
?我們先看一個例子,來自Win7系統的Windows照片查看器: ?
??
?從以上3張圖片可以知道,圖片一直在窗體中保持寬高比不變的前提下,最大縮放。首先我們自己想一下如果是自己手動做到這個效果,思維是怎樣判斷的。每個人的思維都不一樣,你要做的是用編程語言把你自己的思維方式表現出來。以下是我兩種思維方式:
一.
1.看到一張需要縮放的圖片時,大腦中大概得到寬高比,Proportion
2.得到一個窗口,我以窗口的高作為我最后縮放的高,根據圖片的比例虛構一下寬,跟窗口的寬的差別。
如果我腦海中虛構出來的寬比窗口的寬長的話,就如果以窗口的高作為圖片縮放的高的話,圖片按照比例窗口不能顯示。就那以窗口的寬作為最后縮放的寬,腦海中再虛構一遍。(圖2)。
如果我腦海中虛構出來的寬比窗口的寬短的話,就證明窗口能顯示按比例縮放之后的圖片(圖1)。
二.
1.將窗口的寬與圖片的寬的比例,窗口的高與圖片的高的比例,比較一下。也就是想一下圖片的形狀是矩形(寬>高),跟窗口的形狀有多大的差別。例如圖1跟圖2,很明顯知道圖1是寬度相差太大了,圖2的高相差太大。
2.將比例變化少的那個作為縮放后的長度。圖1以高最為最后縮放圖的高,圖2以寬作為最后縮放圖的寬。
?
(可能我的表達能力不是很好,大家可能還不明白,我把代碼貼出來,大家應該就會明白了。)
?
Code?1Public?Class?ClsThumbnailClass?ClsThumbnail
?2????Private?m_def_width,?m_def_height?As?Integer?'圖片默認的寬高
?3????Private?m_win_width,?m_win_height?As?Integer?'窗口的寬高
?4
?5????Private?m_th_width,?m_th_height?As?Integer?'縮放之后的寬高
?6
?7????Private?m_Proportion?As?Double?'默認寬高比
?8
?9????Private?m_pro_w,?m_pro_h?As?Double?'圖片與窗口的寬比,高比
10
11????Sub?New()Sub?New(ByVal?defWidth?As?Integer,?ByVal?defHeight?As?Integer,?ByVal?winWidth?As?Integer,?ByVal?winHeigth?As?Integer)
12????????m_def_width?=?defWidth
13????????m_def_height?=?defHeight
14????????m_win_height?=?winHeigth
15????????m_win_width?=?winWidth
16????????'初始化屬性
17????End?Sub
18
19????Public?Function?getThumnnailBySize()Function?getThumnnailBySize()?As?Size
20????????'Call?ThPicture1()
21????????'第一種想法
22????????Call?ThPicture2()
23????????'第二種想法
24????????Dim?Psize?As?Size?=?New?Size(m_th_width,?m_th_height)
25????????Return?Psize
26????End?Function
27
28????Private?Sub?ThPicture1()Sub?ThPicture1()
29????????m_Proportion?=?m_def_width?/?m_def_height
30????????If?m_win_height?*?m_Proportion?<?m_win_width?Then
31????????????m_th_width?=?m_win_height?*?m_Proportion
32????????????m_th_height?=?m_win_height
33????????ElseIf?m_win_height?*?m_Proportion?>?m_win_width?Then
34????????????m_th_width?=?m_win_width
35????????????m_th_height?=?m_win_width?/?m_Proportion
36????????ElseIf?m_win_height?*?m_Proportion?=?m_win_width?Then
37????????????m_th_width?=?m_win_width
38????????????m_th_height?=?m_win_height
39????????End?If
40????End?Sub
41
42????Private?Sub?ThPicture2()Sub?ThPicture2()
43????????m_pro_w?=?m_win_width?/?m_def_width
44????????m_pro_h?=?m_win_height?/?m_def_height
45????????If?m_pro_w?>?m_pro_h?Then
46????????????m_th_width?=?m_def_width?*?m_pro_h
47????????????m_th_height?=?m_win_height
48????????ElseIf?m_pro_w?<?m_pro_h?Then
49????????????m_th_width?=?m_win_width
50????????????m_th_height?=?m_win_height?*?m_pro_w
51
52????????ElseIf?m_pro_w?=?m_pro_h?Then
53????????????m_th_width?=?m_win_width
54????????????m_th_height?=?m_win_height
55
56????????End?If
57
58
59????End?Sub
60End?Class
61
?
代碼我沒測試,自行測試,雖然在WinForm的編程中只需設計PictureBox的縮放模式為Zoom就可以輕松得到。但是在網頁中用來制作縮略圖還是有一點用處的。
?
?
?其實這個是我畢業設計那個播放器的視頻縮放自適應的功能,我只是換了一個方式寫出來,所以上面的代碼才沒測試。因為在播放器哪里已經測試過,只是上面用面向對象寫了出來,不知道有沒有什么問題,剛剛才學面向對象,第一次發代碼,大家見諒。昨晚都沒怎么看到書,師弟來了宿舍,聊天到2點多。
?嗚嗚,今天真的好黑,去飯堂買飯,居然還差兩個人就到我啦,阿姨居然說,不好意思啊,方盒賣完啦。我哭,只好去買個粉吃,買了回到宿舍一吃,冷的!痛苦。這個月的流量用完了,只能低速上網,博客退到下午才更新。。
轉載于:https://www.cnblogs.com/jielife/archive/2009/10/30/1593244.html
總結
- 上一篇: VB.Net中关于数组赋值
- 下一篇: JavaScript 中 window.