2010-03-11 36 views
7

Tôi có một ứng dụng ASP.NET MVC 2 nhắm mục tiêu .NET 4 cần có khả năng thay đổi kích thước hình ảnh khi đang di chuyển và ghi chúng vào phản hồi.Có thể sử dụng các hội đồng WPF trong một ứng dụng web không?

Tôi có mã thực hiện điều này và hoạt động. Tôi đang sử dụng System.Drawing.dll.

Tuy nhiên, tôi muốn nâng cao mã của mình để không chỉ tôi thay đổi kích thước hình ảnh, nhưng tôi thả nó từ 24bpp xuống còn 4bit grayscale. Tôi không thể, cho cuộc sống của tôi, tìm mã trên làm thế nào để làm điều này với System.Drawing.dll.

Nhưng tôi đã tìm thấy một loạt các công cụ WPF. Đây là mã mẫu làm việc/mẫu của tôi (chạy trong LinqPad).

// Load the original 24 bit image 
var bitmapImage = new BitmapImage(); 
bitmapImage.BeginInit(); 
bitmapImage.UriSource = new Uri(@"C:\Temp\Resized\18_appa2_015.png", UriKind.Absolute); 
//bitmapImage.DecodePixelWidth = 600; 
bitmapImage.EndInit(); 

// Create the destination image 
var formatConvertedBitmap = new FormatConvertedBitmap(); 
formatConvertedBitmap.BeginInit(); 
formatConvertedBitmap.Source = bitmapImage; 
formatConvertedBitmap.DestinationFormat = PixelFormats.Gray4; 
formatConvertedBitmap.EndInit(); 

// Encode and dump the image to disk 
var encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(formatConvertedBitmap)); 
using (var fileStream = File.Create(@"C:\Temp\Resized\18_appa2_015_s2.png")) 
{ 
    encoder.Save(fileStream); 
} 

Sử dụng System.Xaml.dll, WindowsBase.dll, PresentationCore.dll và PresentationFramework.dll. Các không gian tên được sử dụng là: System.Windows.Controls, System.Windows.Media và System.Windows.Media.Imaging.

Có vấn đề gì khi sử dụng các không gian tên này trong ứng dụng web của tôi không? Nó có vẻ không đúng.

Nếu có ai biết làm thế nào để giảm độ sâu bit mà không có tất cả các công cụ WPF này (mà tôi hầu như không hiểu, BTW) tôi sẽ vui mừng khi thấy điều đó.

Trả lời

7

Không sao cả. Bạn có thể dễ dàng sử dụng WPF để thao tác hình ảnh từ bên trong một trang web ASP.NET. Tôi đã sử dụng WPF đằng sau hậu trường trong một trang web nhiều lần trước đây, và nó hoạt động tuyệt vời.

Một vấn đề mà tôi đã gặp phải là nhiều phần của WPF đã nhấn mạnh các chuỗi cuộc gọi là chuỗi STA. Nếu trang web của bạn sử dụng chủ đề MTA thay vào đó bạn sẽ nhận được một lỗi nói với bạn rằng WPF cần chủ đề STA. Để khắc phục điều này, hãy sử dụng lớp STAThreadPool tôi đã đăng trong this answer.

+0

Tôi sẽ thử điều này ngay bây giờ và xem nó như thế nào. – Chris

+0

Nó hoạt động. Nó không phàn nàn về chủ đề hay gì cả. Tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời, vì bạn đã cung cấp thông tin bổ sung này. – Chris

1

Sự hiểu biết của tôi (và tôi không thể tìm thấy một trích dẫn ngay bây giờ) là điều này là chính thức không được hỗ trợ. Tuy nhiên, trong thực tế, nó có vẻ hoạt động khá tốt và bạn sẽ không đơn độc trong việc sử dụng các thư viện này trong một ứng dụng Web. Ngoài ra, ngay cả khi bạn có thể tìm cách làm điều này với System.Drawing, tôi tin rằng chính thức không được hỗ trợ trong môi trường Web - mặc dù nó được sử dụng rộng rãi hơn trong môi trường đó so với WPF, đảm bảo.

+0

Thú vị. Có cách nào tôi đang "nghĩa vụ" để được thay đổi kích thước hình ảnh trong một ứng dụng web, ở phía máy chủ? Một số cách được hỗ trợ? – Chris

+0

Không phải là tôi biết, ngoài việc viết/tìm mã điều khiển các byte trực tiếp (yuck). Trong thực tế, tất cả mọi người đã sử dụng System.Drawing theo truyền thống và nó đã hoạt động tốt. Và như Ray nói trong câu trả lời của mình, sử dụng WPF cũng hoạt động tốt trong thực tế. Nếu tôi có yêu cầu của bạn, tôi sẽ đi cho nó, và chỉ cần chắc chắn rằng tôi đã thử nghiệm kỹ lưỡng (đặc biệt là dưới tải). – itowlson

+0

Cảm ơn bạn đã trả lời nhanh chóng! – Chris

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