2012-06-21 44 views
5

Hình ảnh được làm mới từ máy ảnh kỹ thuật số thường có kích thước lớn hơn 2-3 MB khiến việc truyền tải qua email và các cách khác trở nên khó khăn. Điều này yêu cầu thay đổi kích thước hình ảnh (về kích thước tệp và không phải chiều cao hoặc chiều rộng). Khá giống với tính năng thay đổi kích thước hình ảnh của MS Paint. Tôi không được đào tạo tốt về lý thuyết tệp hình ảnh. Tôi sẽ đánh giá cao nếu ai đó có thể chỉ cho tôi hướng sau các nguồn thông tin:Thay đổi kích thước hình ảnh bằng cách sử dụng C#

  • lý thuyết hình ảnh (bao nhiều định dạng hình ảnh làm việc jpeg, png, tiff vv).?

  • Hình ảnh mất độ sắc nét khi thay đổi kích thước như thế nào? Có một số

  • Có thư viện .Net (Tôi đang sử dụng 4.0) miễn phí nào có sẵn để thực hiện việc này không? Nếu tôi không thể sử dụng bất kỳ thư viện nào bằng cách sử dụng com interoperabilty?

Rất cám ơn,

+0

Đọc trên "lượng tử hóa màu" http://en.wikipedia.org/wiki/Color_quantization – BryanJ

+0

Các Bitmap (hình ảnh, chiều rộng, chiều cao) constructor làm một công việc khá đáng tin cậy mà không có nhiều phiền toái. Tuy nhiên, –

+0

Chất lượng tệ hại. –

Trả lời

24

hình ảnh thay đổi kích thước là chức năng được tích hợp ngay .NET framework. Có một vài phương pháp khác nhau:

  • GDI +
  • WIC
  • WPF

Dưới đây là một đẹp blog post bao gồm sự khác biệt giữa chúng.

Dưới đây là một ví dụ với GDI +:

public void Resize(string imageFile, string outputFile, double scaleFactor) 
{ 
    using (var srcImage = Image.FromFile(imageFile)) 
    { 
     var newWidth = (int)(srcImage.Width * scaleFactor); 
     var newHeight = (int)(srcImage.Height * scaleFactor); 
     using (var newImage = new Bitmap(newWidth, newHeight)) 
     using (var graphics = Graphics.FromImage(newImage)) 
     { 
      graphics.SmoothingMode = SmoothingMode.AntiAlias; 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight)); 
      newImage.Save(outputFile); 
     } 
    } 
} 
+0

Cảm ơn Darin. Tôi không muốn đề cập đến chiều rộng và chiều cao về số. Thay vào đó, chúng sẽ được đề cập theo tỷ lệ phần trăm. Để sử dụng điều này tôi sẽ phải (có thể) tính chiều rộng chiều cao của các hình ảnh hiện có. – James

+0

Có, bạn có thể thực hiện việc này sau khi tải 'srcImage'. Giữa câu lệnh 'using' đầu tiên và thứ hai. Bạn đã sử dụng srcImage.Width và srcImage.Height để tính newWidth và newHeight được truyền cho hàm tạo bitmap. –

+0

Tôi đã cập nhật bài đăng của mình bằng một ví dụ. –

7

Tôi đã sử dụng ví dụ do Darin Dimitrov cung cấp, Hình ảnh được tăng lên và chiếm nhiều không gian đĩa (từ 1,5MB đến 17MB hoặc hơn).

Điều này là do một lỗi nhỏ trong dòng mã cuối cùng.

Chức năng dưới đây sẽ lưu hình ảnh dưới dạng Bitmap (kích thước hình ảnh lớn).

newImage.Save(outputFile) 

Chức năng chính xác nên được:

newImage.Save(outputFile, ImageFormat.Jpeg); 
Các vấn đề liên quan