图片缩放自适应

按图片比例预览图片

 我们先看一个例子,来自Win7系统的Windows照片查看器:  

  

 从以上3张图片可以知道,图片一直在窗体中保持宽高比不变的前提下,最大缩放。首先我们自己想一下如果是自己手动做到这个效果,思维是怎样判断的。每个人的思维都不一样,你要做的是用编程语言把你自己的思维方式表现出来。以下是我两种思维方式:

一.

1.看到一张需要缩放的图片时,大脑中大概得到宽高比,Proportion

2.得到一个窗口,我以窗口的高作为我最后缩放的高,根据图片的比例虚构一下宽,跟窗口的宽的差别。

如果我脑海中虚构出来的宽比窗口的宽长的话,就如果以窗口的高作为图片缩放的高的话,图片按照比例窗口不能显示。就那以窗口的宽作为最后缩放的宽,脑海中再虚构一遍。(图2)。

如果我脑海中虚构出来的宽比窗口的宽短的话,就证明窗口能显示按比例缩放之后的图片(图1)。

二.

1.将窗口的宽与图片的宽的比例,窗口的高与图片的高的比例,比较一下。也就是想一下图片的形状是矩形(宽>高),跟窗口的形状有多大的差别。例如图1跟图2,很明显知道图1是宽度相差太大了,图2的高相差太大。

2.将比例变化少的那个作为缩放后的长度。图1以高最为最后缩放图的高,图2以宽作为最后缩放图的宽。

 

(可能我的表达能力不是很好,大家可能还不明白,我把代码贴出来,大家应该就会明白了。)

 

ContractedBlock.gifExpandedBlockStart.gifCode
 1ExpandedBlockStart.gifContractedBlock.gifPublic 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
11ExpandedSubBlockStart.gifContractedSubBlock.gif    Sub New()Sub New(ByVal defWidth As IntegerByVal defHeight As IntegerByVal winWidth As IntegerByVal 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
19ExpandedSubBlockStart.gifContractedSubBlock.gif    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
28ExpandedSubBlockStart.gifContractedSubBlock.gif    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
42ExpandedSubBlockStart.gifContractedSubBlock.gif    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值