2011-11-02 246 views
0

基本上,我有一個圖像可能很大(在高度和寬度上都有幾千像素),並且在寬度和高度上可能會有相當大的變化。計算圖像尺寸

我需要做的是在大約500像素的高度和寬度上顯示這些圖像 - 但我想保持這些圖像的縱橫比完好無損,所以這些值會非常接近。但是我對我可以在原始寬度和高度上使用哪些計算來讓他們獲得正確的數字感到困惑。

任何想法?

+2

有你看這裏http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio –

+0

在什麼平臺上顯示出來? Silverlight的? WPF?的WinForms? asp.net? (等)你的答案可以依賴於這些信息。 –

回答

0

試試這個:

Size original = new Size(5000,4000); 
double ratio = (double)original.Height/original.Width; 
int resizePercent = 50; 
int newWidth = Convert.ToInt32(original.Width*resizePercent/100); 
int newHeight = Convert.ToInt32(newWidth * ratio); 
Size resized = new Size(newWidth,newHeight); 

當然只是原變量設置爲你的圖片大小,並確定你的大小調整比例。你可以計算調整大小的百分比,如果你有這樣的目標寬度:

int targetWidth = 500; 
int resizePercent = Convert.ToInt32((double)original.Width/targetWidth); 
0

幾個星期前我遇到了這個問題。看看這篇文章http://www.4guysfromrolla.com/articles/012203-1.2.aspx

創建一個通用處理器(ashx的),用於查找圖像,調整其大小,並將其返回

這裏是我最終使用(你可以在飛行中調整):

public void ProcessRequest (HttpContext context) { 
    TimeSpan refresh = new TimeSpan(168, 0, 0); 
    HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.Add(refresh)); 
    HttpContext.Current.Response.Cache.SetMaxAge(refresh); 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public); 
    HttpContext.Current.Response.Cache.SetValidUntilExpires(true); 

    string dir = HttpContext.Current.Request.QueryString["dir"]; 
    string img = HttpContext.Current.Request.QueryString["img"]; 
    bool force = HttpContext.Current.Request.QueryString["force"] == "yes"; 
    double w = 0; 
    double h = 0; 

    string path = null; 
    Image orig = null; 
    Image thumb = null; 

    //make sure we have a directory and image filename 
    if (string.IsNullOrEmpty(dir)) 
     return; 

    //make sure that we allow access to that directory, could do some extra sneaky security stuff here if we had to... (only accept a DirectoryID so the user doesn't know the actual path) 
    switch (dir) 
    { 
     case "user": 
      dir = "assets/images/users"; 
      if (string.IsNullOrEmpty(img) || img == "undefined") img = "0.jpg"; 
      break; 
      break; 
     case "icon": 
      dir = "assets/images/icons"; 
      break; 
     default: 
      dir = "assets/images"; 
      break; 
    } 

    //make sure that the image filename is just a filename 
    if (img.IndexOf("/") > -1 | img.IndexOf("\\") > -1) 
     return; 

    //make sure the image exists 
    path = HttpContext.Current.Server.MapPath("~/" + dir + "/" + img); 
    if (System.IO.File.Exists(path)) 
    { 
     orig = Image.FromFile(path); 
    } 
    else 
    { 
     return; 
    } 


    //if there is a max width or height 
    if (double.TryParse(HttpContext.Current.Request.QueryString["w"], out w) | double.TryParse(HttpContext.Current.Request.QueryString["h"], out h)) 
    { 
     //thumb is the resized image 
     double s = 1; 
     if (w > 0 & h > 0) 
     { 
      double ratio = h/w; 
      if (orig.Height/(double)orig.Width > ratio) 
      { 
       if (orig.Height > h) 
       { 
        if (force) 
         s = w/(double)orig.Width; 
        else 
         s = h/(double)orig.Height; 
       } 
      } 
      else 
      { 
       if (orig.Width > w) 
       { 
        if (force) 
         s = h/(double)orig.Height; 
        else 
         s = w/(double)orig.Width; 
       } 
      } 
     } 
     else if (w > 0) 
     { 
      if (orig.Width > w) 
      { 
       s = w/(double)orig.Width; 
      } 
     } 
     else if (h > 0) 
     { 
      if (orig.Height > h) 
      { 
       s = h/(double)orig.Height; 
      } 
     } 

     //double flip gets it to lose the embedded thumbnail 
     //http://www.4guysfromrolla.com/articles/012203-1.2.aspx 
     orig.RotateFlip(RotateFlipType.Rotate180FlipNone); 
     orig.RotateFlip(RotateFlipType.Rotate180FlipNone); 

     thumb = orig.GetThumbnailImage(Convert.ToInt32(orig.Width * s), Convert.ToInt32(orig.Height * s), null, IntPtr.Zero); 

     if (force && w > 0 & h > 0) 
      thumb = cropImage(thumb, (int)w, (int)h); 
    } 
    else 
    { 
     //thumb is the image at it's original size 
     thumb = orig; 
    } 

    HttpContext.Current.Response.ContentType = "image/jpeg"; 
    thumb.Save(HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 


private Image cropImage(Image img, int w, int h) 
{ 
    if (w > img.Width && h > img.Height) 
     return img; 
    Rectangle cropArea = new Rectangle((img.Width - w)/2, (img.Height - h)/2, w, h); 
    Bitmap bmpImage = new Bitmap(img); 
    Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); 
    return (Image)(bmpCrop); 
} 

public bool IsReusable { 
    get { 
     return false; 
    } 
} 
+0

你怎麼知道他想要在網頁上顯示? :) –