Можно ли использовать сборки WPF в веб-приложении? - PullRequest
7 голосов
/ 11 марта 2010

У меня есть приложение ASP.NET MVC 2, предназначенное для .NET 4, которое должно иметь возможность изменять размеры изображений на лету и записывать их в ответ.

У меня есть код, который делает это, и это работает. Я использую System.Drawing.dll.

Однако я хочу улучшить свой код, чтобы не только изменять размер изображения, но и уменьшать его с 24 бит / с до 4-битного оттенка серого. Я не могу, на всю жизнь, найти код, как это сделать с System.Drawing.dll.

Но я нашел кучу вещей из WPF. Это мой рабочий / пример кода (работает в 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);
}

Он использует System.Xaml.dll, WindowsBase.dll, PresentationCore.dll и PresentationFramework.dll. Используются следующие пространства имен: System.Windows.Controls, System.Windows.Media и System.Windows.Media.Imaging.

Есть ли проблемы с использованием этих пространств имен в моем веб-приложении? Это не кажется правильным.

Если кто-нибудь знает, как уменьшить битовую глубину без всего этого WPF (что я едва понимаю, кстати), я был бы рад увидеть это тоже.

Ответы [ 2 ]

7 голосов
/ 11 марта 2010

Нет проблем.Вы можете легко использовать WPF для работы с изображениями на веб-сайте ASP.NET.Я использовал WPF за кулисами на веб-сайте несколько раз, и он прекрасно работает.

Одна проблема, с которой я столкнулся, состоит в том, что многие части WPF настаивают на вызывающих потокахбыть STA темы.Если ваш веб-сайт использует потоки MTA, вы получите сообщение об ошибке, в котором говорится, что WPF нужны потоки STA.Чтобы исправить это, используйте класс STAThreadPool, который я опубликовал в этот ответ .

1 голос
/ 11 марта 2010

Насколько я понимаю (и сейчас не могу найти цитату), это официально не поддерживается. Однако на практике это работает довольно хорошо, и вы не будете одиноки в использовании этих библиотек в веб-приложении. Кроме того, даже если вы можете найти способ сделать это с помощью System.Drawing, я считаю, что официально он также не поддерживается в веб-среде - хотя он более широко используется в этой среде, чем WPF, что дает вам дополнительный уровень перестраховка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...