随笔 - 51  文章 - 0 评论 - 210 trackbacks - 6
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

严正声明 : 本站文章转载请注明出处.

与我联系

搜索

 

留言簿(11)

我的标签

随笔分类

随笔档案

Atlas相关

积分与排名

  • 积分 - 58801
  • 排名 - 800

阅读排行榜

为了能保持住照片在缩小时不变形,所以需要重新计算缩略图的尺寸. 这里默认缩略图的尺寸的应该满足 长 >= 宽, 否则计算规则应有所变化.

今天突然想明白了,记在这里以后备用.
        /// <summary>
        
/// 取得缩略图的尺寸
        
/// </summary>
        
/// <param name="oldSize">原始尺寸</param>
        
/// <param name="desiredSize">目标尺寸</param>
        
/// <returns></returns>
        public static Size GetSacaledSize(Size oldSize, Size desiredSize)
        {
            
if (oldSize.Height == 0 || oldSize.Width == 0)
                
throw new Exception("The pic's width and height not set.");

            Size outSize 
= new Size();
            
bool flag = false;

            
//如果宽> 长,则按宽缩放 width = DesiredWidth.
            
//如果 宽<= 长. 则按长缩放 height = DesiredHeight.

            
if (oldSize.Width <= desiredSize.Width && oldSize.Height <= desiredSize.Height)
            {
                outSize 
= oldSize;
                flag 
= true;
            }

            
if (!flag)
            {
                
if (oldSize.Width > oldSize.Height)
                {
                    outSize.Width 
= desiredSize.Width;
                    
double ratio = (double)desiredSize.Width / oldSize.Width;
                    outSize.Height 
= Convert.ToInt32(oldSize.Height * ratio);
                    flag 
= true;
                }
            }

            
if (!flag)
            {
                outSize.Height 
= desiredSize.Height;
                
double ratio = (double)desiredSize.Height / oldSize.Height;
                outSize.Width 
= Convert.ToInt32(oldSize.Width * ratio);
            }


            
return outSize;
        }

这里是单元测试代码:

    /// <summary>
    
/// 这个测试用来测试在几种不同尺寸下面的缩略图尺寸算法的问题.
    
/// </summary>
    [TestFixture]
    
public class PhotoCacheTestFixture
    {
        [Test]
        
public void CacheSizeTest()
        {
            Photos p 
= new Photos();

            
//常见情况, 长大于宽的尺寸.
            p.PhotoHeight = 1200;
            p.PhotoWidth 
= 1600;

            Size sizeSacled 
= p.SacledSize(ScaledPicSize.Instance.Size130x130);

            Console.WriteLine(
"1600X1200");
            Console.WriteLine(sizeSacled.Width);
            Console.WriteLine(sizeSacled.Height);
            Console.WriteLine(
"++++++++++++++++++");
            
            Assert.IsTrue(sizeSacled.Width 
<= 130);
            Assert.IsTrue(sizeSacled.Height 
<= 130);

            
//原图比缩略图尺寸还小的情况.直接返回原尺寸.
            p.PhotoWidth = 100;
            p.PhotoHeight 
= 80;

            Size size2 
= p.SacledSize(ScaledPicSize.Instance.Size130x130);

            Console.WriteLine(
"100X80");
            Console.WriteLine(size2.Width);
            Console.WriteLine(size2.Height);
            Console.WriteLine(
"++++++++++++++++++");


            Assert.IsTrue(size2.Width 
<= 130);
            Assert.IsTrue(size2.Height 
<= 130);

            
// 长版的图片尺寸.

            p.PhotoWidth 
= 80;
            p.PhotoHeight 
= 140;

            Size size3 
= p.SacledSize(ScaledPicSize.Instance.Size130x130);

            Console.WriteLine(
"80X140");
            Console.WriteLine(size3.Width);
            Console.WriteLine(size3.Height);
            Console.WriteLine(
"++++++++++++++++++");

            Assert.IsTrue(size3.Width 
<= 130);
            Assert.IsTrue(size3.Height 
<= 130);
        }
    }



posted on 2007-12-18 17:55 沙加 阅读(344) 评论(3)  编辑 收藏 网摘 所属分类: .Net开发技巧系列

FeedBack:
#1楼  2007-12-20 12:43 Jeason      
MAX(长宽)/Max(缩略图长宽) 可以得到比例啊
  回复  引用  查看    
#2楼 [楼主] 2008-07-17 09:51 沙加      
补充一点跟缩略图有关的客户端缓存的内容, HTTP/1.1中有一个Etag,用来判断请求的文件是否被修改。
为什么要使用Etag呢?Etag主要为了解决Last-Modified无法解决的一些问题
1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)
3、某些服务器不能精确的得到文件的最后修改时间;
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接: