2011-01-19 40 views
7

Tôi đã có một ứng dụng web nơi người dùng có thể tải lên hình ảnh. Vấn đề hiện tại tôi đang gặp phải là các hình ảnh đang được tải lên đang được lưu vào cơ sở dữ liệu ở định dạng gốc. Điều này gây ra rất nhiều vấn đề hiệu suất khi hình ảnh được sử dụng trên một trang web. Tôi đã sử dụng dotTrace để cấu hình ứng dụng và tôi thấy các vấn đề quan trọng khi hình ảnh được xử lý từ cơ sở dữ liệu.C# hình ảnh mvc tải lên thay đổi kích thước phía máy chủ

Ý tưởng tôi có là định lại kích thước hình ảnh khi được tải lên máy chủ. Lấy ví dụ sau mà tôi muốn ứng dụng thực hiện khi người dùng tải lên một hình ảnh mới;

  1. tài tải lên một hình ảnh
  2. Hình ảnh đã được thay đổi kích cỡ để kích thước của 7.500 x 7.500 pixel ở 72 dpi
  3. Những hình ảnh đang được lưu vào cơ sở dữ liệu
  4. gốc tập tin được xử lý

Hình ảnh được lưu trữ duy nhất là hình ảnh được đề cập ở trên và ứng dụng web chứa công nghệ để thay đổi kích thước này khi đang di chuyển.

Tôi đã đọc một số chủ đề ở đây trên SO. Và hầu hết trong số họ chỉ cho tôi theo hướng của ImageMagick. Công cụ này đã quen thuộc với công ty của tôi và đang được sử dụng trong các dự án PHP. Nhưng có bất kỳ trình bao bọc C# được phát hành tốt và ổn định nào cho công cụ này không? Tôi đã tìm thấy các công cụ dưới đây nhưng chúng đang được phát hành Béta, Alpha Release hoặc hiện không được cập nhật.

ImageMagick.NET

ImageMagick APP

Tôi cũng thấy this chủ đề trên SO. Trong chủ đề này, ví dụ mã sau được cung cấp;

private static Image CreateReducedImage(Image imgOrig, Size newSize) 
{ 
    var newBm = new Bitmap(newSize.Width, newSize.Height); 
    using (var newGrapics = Graphics.FromImage(newBm)) 
    { 
     newGrapics.CompositingQuality = CompositingQuality.HighSpeed; 
     newGrapics.SmoothingMode = SmoothingMode.HighSpeed; 
     newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, newSize.Width, newSize.Height)); 
    } 

    return newBm; 
} 

Tóm lại các câu hỏi tôi có;

  • Có lợi thế nào liên quan đến hiệu suất sử dụng ví dụ trên không?
  • Có trình bao bọc C# tốt và đáng tin cậy cho ImageMagick tôi có thể sử dụng để thực hiện việc này không?

Bất kỳ mẹo hay nào khác liên quan đến hiệu suất đều được hoan nghênh!

+1

http://imageresizing.net là cách để thực hiện. Nó được kiểm tra, đáng tin cậy và hoạt động với độ tin cậy thấp. Nó xử lý nhiều định dạng dễ dàng và có thể được gọi trong một dòng mã. Thư viện cực kỳ linh hoạt và có khả năng. –

Trả lời

3

Chúng tôi sử dụng cách tiếp cận thứ hai - Tôi không thể nhận xét về hiệu suất nhưng nó chắc chắn làm cho việc xử lý phụ thuộc đơn giản hơn.

Tuy nhiên, có một điều cần lưu ý là mã trên có thể quá đơn giản nếu người dùng của bạn có thể tải lên hình ảnh ở tất cả các loại định dạng. Thư viện cơ bản (GDI +) có vấn đề với rất nhiều định dạng màu, nhưng nó cũng phụ thuộc vào phiên bản hệ điều hành. Đây là cốt lõi của mã chúng tôi sử dụng:

// GDI+ has problems with lots of image formats, and it also chokes on unknown ones (like CMYK). 
// Therefore, we're going to take a whitelist approach. 
// see http://bmpinroad.blogspot.com/2006/04/file-formats-pixel-formats.html 
// also see http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/c626a478-e5ef-4a5e-9a73-599b3b7a6ecc 
PixelFormat format = originalImage.PixelFormat; 

if (format == PixelFormat.Format16bppArgb1555 || 
    format == PixelFormat.Format64bppArgb) 
{ 
    // try to preserve transparency 
    format = PixelFormat.Format32bppArgb; 
} 
else if (format == PixelFormat.Format64bppPArgb) 
{ 
    // try to preserve pre-multiplied transparency 
    format = PixelFormat.Format32bppPArgb; 
} 
else if (format != PixelFormat.Format24bppRgb && format != PixelFormat.Format32bppRgb) 
{ 
    format = PixelFormat.Format24bppRgb; 
} 


// GIF saving is probably still an issue. If we ever need to tackle it, see the following: 
// http://support.microsoft.com/kb/319061 
// http://www.bobpowell.net/giftransparency.htm 
// http://support.microsoft.com/kb/318343 


using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, format)) 
{ 
    using (Graphics Canvas = Graphics.FromImage(newImage)) 
    { 
     using (ImageAttributes attr = new ImageAttributes()) 
     { 
      attr.SetWrapMode(WrapMode.TileFlipXY); 

      Canvas.SmoothingMode = SmoothingMode.AntiAlias; 
      Canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      Canvas.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      Canvas.DrawImage(originalImage, new Rectangle(new Point(0, 0), newSize), srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, GraphicsUnit.Pixel, attr); 
      newImage.Save(outputImageStream, originalImage.RawFormat); 
     } 
    } 
} 
+0

Chúng tôi có thể xác định khách hàng có định dạng để tải lên. Ý tưởng là để giữ nguyên tệp gốc khi GIF (vì hoạt ảnh) và PNG (vì tính minh bạch) được tải lên. Tất cả các định dạng khác (chủ yếu là JPG, đôi khi BMP của TIFF) sẽ gây ra bất kỳ vấn đề nào khi sử dụng phương pháp này? Hoặc cách tiếp cận GDI +? – Rob

+0

Và nếu tôi muốn đặt pixelformat thành 72DPI. Làm thế nào tôi có thể đạt được điều này? Định dạng nào để sử dụng? – Rob

+1

Đối tượng Bitmap (newImage trong trường hợp này) có các thuộc tính HorizontalResolution và VerticalResolution mà bạn có thể sửa đổi để thiết lập pixel trên mỗi inch. GIF có thể khó khăn hơn. Bạn sẽ phải đối phó với tính minh bạch và vẽ lại hình ảnh với bảng màu gốc của nó - xem các liên kết trong các chú thích mã. Đối với hình ảnh động, tôi nghĩ rằng bạn có thể lặp qua các khung hình của hình ảnh bằng cách sử dụng originalImage.SelectActiveFrame(), nhưng tôi đã không thử nó, và tôi cũng không chắc chắn làm thế nào bạn có thể tái kết hợp các khung hình một khi bạn đã làm điều đó. –

2

Tôi chưa bao giờ sử dụng ImageMagic, nhưng tôi đã sử dụng chức năng thay đổi kích thước hình ảnh GDI +, bao gồm trên trang web tạo và thay đổi 100.000 ảnh mỗi ngày không có vấn đề về hiệu suất.

Tôi cho rằng việc sử dụng các phương pháp GDI + là tốt. Đừng lo lắng về việc gói một công cụ hoặc khung công cụ bên ngoài.

+0

Hiện đang cố gắng triển khai giải pháp tốt bằng GDI +. Sẽ cho bạn biết kết quả – Rob

+0

Các phương pháp GDI là tốt, miễn là bạn [vứt bỏ mọi thứ trong sử dụng() {} mệnh đề và tránh 25 lỗi] (http://nathanaeljones.com/163/20-image-resizing -pitfalls /). –

1

Tôi đã sử dụng ImageGen trong các trang web của Umbraco. (Nó chắc chắn không gắn với Umbraco, nó tốt cho bất kỳ ứng dụng ASP.NET nào, nó chỉ xảy ra khi một số gói Umbraco mà tôi đang sử dụng yêu cầu nó.) Thật đơn giản để sử dụng, và bạn có thể có được miễn phí phiên bản ...

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