2009-04-01 37 views
14

Có thể thay đổi kích cỡ hình ảnh theo tỷ lệ theo cách độc lập với loại hình ảnh (bmp, jpg, png, v.v ...) không?Làm thế nào để thay đổi kích thước hình ảnh tỷ lệ của bất kỳ loại nào trong .NET?

Tôi có mã này và biết rằng cái gì là mất tích (nhưng không biết gì):

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int width, int height) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

Nếu không thể, làm thế nào tôi có thể thay đổi kích thước theo tỷ lệ một hình ảnh jpeg?

Tôi biết rằng việc sử dụng this method, nhưng không biết đặt giá trị này ở đâu (!).

+5

Hình ảnh PNG và Gif 8-bit yêu cầu tái lượng tử và phối màu lại khi được thay đổi kích thước (không nhỏ)! Giải pháp tốt nhất là sử dụng một thư viện được quản lý được thiết kế để xử lý tất cả các định dạng/cạnh đúng cách, duy trì tỷ lệ khung hình, vv [Thư viện ImageResizer] (http://imageresizingin.net/) là một công cụ đã được chứng minh cho tác vụ này cũng như cắt xén, xoay và lật. Đó là mã nguồn mở, vì vậy nếu bạn cảm thấy như đang lăn giải pháp của riêng mình, chỉ cần sao chép và dán. Nó cũng cho phép rất nhiều những thứ hữu ích khác thông qua các plugin, như watermarking, disk caching, sql blobs, S3 reading, v.v. –

+0

Đến đây để cải thiện khả năng chỉnh sửa ảnh của tôi và phát hiện Thư viện ImageResizer. Nó là tuyệt vời. 1 cho nhà ngôn ngữ học máy tính! – Chris

+1

URL trong câu trả lời của Nhà ngôn ngữ học máy tính phải là: http://imageresizing.net/ – glenatron

Trả lời

16

Đầu tiên và trước hết, bạn không lấy chiều cao và chiều rộng của hình ảnh CURRENT. Để thay đổi kích thước tương ứng, bạn sẽ cần phải lấy chiều cao/chiều rộng hiện tại của hình ảnh và thay đổi kích thước dựa trên đó.

Từ đó, tìm thuộc tính lớn nhất và thay đổi kích thước tương ứng dựa trên đó. Ví dụ:

Ví dụ: giả sử hình ảnh hiện tại là 800 x 600 và bạn muốn thay đổi kích thước tương ứng trong khoảng 400 x 400. Lấy tỷ lệ lớn nhất (800) và tìm tỷ lệ của nó với kích thước mới. 800 -> 400 = .5 Bây giờ lấy tỷ lệ đó và nhân với kích thước thứ hai (600 * .5 = 300).

kích thước mới của bạn là 400 x 300. Dưới đây là một ví dụ PHP (xin lỗi .... bạn sẽ nhận được nó mặc dù)

$thumb_width = 400; 
$thumb_height = 400; 

$orig_w=imagesx($src_img); 
$orig_h=imagesy($src_img);  

if ($orig_w>$orig_h){//find the greater proportion 
    $ratio=$thumb_width/$orig_w; 
    $thumb_height=$orig_h*$ratio; 
}else{ 
    $ratio=$thumb_height/$orig_h; 
    $thumb_width=$orig_w*$ratio; 
} 
9

Tôi nghĩ rằng mã của bạn là tốt, nhưng dùng trong chiều rộng và chiều cao như thông số là nơi bạn đang đi sai trong quan điểm của tôi. Tại sao người gọi phương thức này lại phải quyết định xem họ muốn chiều rộng và chiều cao như thế nào? Tôi sẽ đề nghị thay đổi nó thành một tỷ lệ phần trăm:

public bool ResizeImage(string fileName, string imgFileName, 
    ImageFormat format, int percent) 
{ 
    try 
    { 
     using (Image img = Image.FromFile(fileName)) 
     { 
      int width = img.Width * (percent * .01); 
      int height = img.Height * (percent * .01); 
      Image thumbNail = new Bitmap(width, height, img.PixelFormat); 
      Graphics g = Graphics.FromImage(thumbNail); 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      g.DrawImage(img, rect); 
      thumbNail.Save(imgFileName, format); 
     } 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
+6

Có thể rất phù hợp để người gọi biết kích thước chính xác mà họ muốn hình ảnh ... ví dụ: nếu tôi có hình ảnh đó là 1024X768 và tôi muốn nó thu nhỏ xuống 50X50 cho hình thu nhỏ, tôi không cần phải tính phần trăm. Cá nhân, tôi sẽ chuẩn hóa về chiều rộng/chiều cao và cung cấp quá tải phần trăm mà cuối cùng gọi ra phiên bản chiều rộng/chiều cao. Tốt nhất của cả hai và không có nhiều mã bổ sung. – ctorx

+0

Tôi biết đây là nhận xét cũ nhưng .. Cá nhân tôi sẽ cung cấp chiều rộng hoặc chiều cao làm hạn chế và duy trì tỷ lệ khung hình sao cho hình ảnh không bị méo mó. Bạn thậm chí có thể chỉ muốn nó thay đổi kích thước cạnh lớn nhất đến 50 bất kể đó là chiều cao hay chiều rộng. –

Các vấn đề liên quan