2010-03-11 5 views
7

Ich habe eine ASP.NET MVC 2 App, die auf .NET 4 abzielt und in der Lage sein muss, die Größe von Bildern im laufenden Betrieb zu ändern und sie in die Antwort zu schreiben.Ist es in Ordnung, WPF-Assemblys in einer Webanwendung zu verwenden?

Ich habe Code, der das tut und es funktioniert. Ich benutze System.Drawing.dll.

Allerdings möchte ich meinen Code verbessern, so dass ich nicht nur die Größe des Bildes skaliere, sondern es von 24bpp auf 4bit Graustufen heruntersetze. Ich konnte für mein Leben Code nicht finden, wie man das mit System.Drawing.dll macht.

Aber ich habe eine Menge WPF-Zeug gefunden. Dies ist mein Arbeits-/Beispielcode (wird in LinqPad ausgeführt).

// 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); 
} 

Es verwendet System.Xaml.dll, WindowsBase.dll, PresentationCore.dll und PresentationFramework.dll. Die verwendeten Namespaces sind: System.Windows.Controls, System.Windows.Media und System.Windows.Media.Imaging.

Gibt es ein Problem bei der Verwendung dieser Namespaces in meiner Webanwendung? Es scheint nicht richtig zu sein.

Wenn jemand weiß, wie man die Bittiefe ohne all diese WPF-Zeug (die ich kaum verstehe, BTW) würde ich mich freuen, das auch zu sehen.

Antwort

7

Kein Problem. Sie können WPF einfach zur Bildbearbeitung von einer ASP.NET-Website aus verwenden. Ich habe WPF hinter den Kulissen innerhalb einer Website mehrere Male zuvor verwendet, und es funktioniert gut.

Das einzige Problem, das ich habe, ist, dass viele Teile von WPF darauf bestehen, dass die aufrufenden Threads STA-Threads sind. Wenn Ihre Website stattdessen MTA-Threads verwendet, erhalten Sie eine Fehlermeldung, dass WPF STA-Threads benötigt. Verwenden Sie die STAThreadPool-Klasse, die ich in this answer veröffentlichte, um das zu beheben.

+0

Ich werde es jetzt versuchen und sehen, wie es geht. – Chris

+0

Es hat funktioniert. Es hat sich nicht über Fäden oder irgendetwas beschwert. Ich werde Ihre Antwort als Antwort markieren, da Sie diese zusätzlichen Informationen zur Verfügung gestellt haben. – Chris

1

Mein Verständnis (und ich finde kein Zitat im Moment) ist, dass dies offiziell nicht unterstützt wird. In der Praxis scheint es jedoch ziemlich gut zu funktionieren und Sie wären nicht allein bei der Verwendung dieser Bibliotheken in einer Web-App. Auch wenn Sie mit System.Drawing einen Weg finden können, dies zu tun, glaube ich, dass das offiziell auch in der Web-Umgebung nicht unterstützt wird - obwohl es in dieser Umgebung häufiger verwendet wird als WPF, was Ihnen ein zusätzliches Level an Beruhigung.

+0

Interessant. Gibt es eine Möglichkeit, die Größe von Bildern in einer Web-App auf der Serverseite zu "ändern"? Einige unterstützte Art und Weise? – Chris

+0

Nicht, dass ich weiß, anders als Schreiben/Finden von Code, der die Bytes direkt manipuliert (yuck). In der Praxis hat jeder traditionell System.Drawing verwendet und es hat gut funktioniert. Und wie Ray in seiner Antwort sagt, funktioniert die Verwendung von WPF auch in der Praxis gut. Wenn ich Ihre Anforderungen hätte, würde ich mich dafür entscheiden und sicherstellen, dass ich gründlich getestet habe (besonders unter Last). – itowlson

+0

Danke für Ihre schnelle Antwort! – Chris

Verwandte Themen