Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как получить список установленных BitmapEncoders / декодеров (мир WPF)?
В WindowsForms world вы можете получить список доступных кодеров/декодеров изображений с помощью
System.Drawing.ImageCodecInfo.GetImageDecoders() / GetImageEncoders()
Мой вопрос заключается в том, есть ли способ сделать что-то аналогичное для мира WPF, что позволило бы мне получить список доступных
System.Windows.Media.Imaging.BitmapDecoder / BitmapEncoder
Вы должны любить .NET отражение. Я работал в команде WPF и не могу себе представить ничего лучше, чем это было бы в моей голове. Следующий код создает этот список на моем компьютере:
Bitmap Encoders:
System.Windows.Media.Imaging.BmpBitmapEncoder
System.Windows.Media.Imaging.GifBitmapEncoder
System.Windows.Media.Imaging.JpegBitmapEncoder
System.Windows.Media.Imaging.PngBitmapEncoder
System.Windows.Media.Imaging.TiffBitmapEncoder
System.Windows.Media.Imaging.WmpBitmapEncoder
Bitmap Decoders:
System.Windows.Media.Imaging.BmpBitmapDecoder
System.Windows.Media.Imaging.GifBitmapDecoder
System.Windows.Media.Imaging.IconBitmapDecoder
System.Windows.Media.Imaging.LateBoundBitmapDecoder
System.Windows.Media.Imaging.JpegBitmapDecoder
System.Windows.Media.Imaging.PngBitmapDecoder
System.Windows.Media.Imaging.TiffBitmapDecoder
System.Windows.Media.Imaging.WmpBitmapDecoder
В коде есть комментарий, куда добавлять дополнительные сборки (например, если вы поддерживаете Плагины). Кроме того, вы захотите отфильтровать список декодеров для удаления:
System.Windows.Media.Imaging.LateBoundBitmapDecoder
Более сложная фильтрация с использованием сопоставления шаблонов конструктора возможна, но я не чувствую, что хочу ее писать. :-)
Все, что вам нужно сделать сейчас, это создать экземпляры кодеров и декодеров, чтобы использовать их. Кроме того, вы можете получить лучшие имена, получив свойство CodecInfo кодировщика декодеров. Этот класс даст вам удобочитаемые имена среди других фактоидов.
using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Media.Imaging;
namespace Codecs {
class Program {
static void Main(string[] args) {
Console.WriteLine("Bitmap Encoders:");
AllEncoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName));
Console.WriteLine("\nBitmap Decoders:");
AllDecoderTypes.ToList().ForEach(t => Console.WriteLine(t.FullName));
Console.ReadKey();
}
static IEnumerable<Type> AllEncoderTypes {
get {
return AllSubclassesOf(typeof(BitmapEncoder));
}
}
static IEnumerable<Type> AllDecoderTypes {
get {
return AllSubclassesOf(typeof(BitmapDecoder));
}
}
static IEnumerable<Type> AllSubclassesOf(Type type) {
var r = new Reflector();
// Add additional assemblies here
return r.AllSubclassesOf(type);
}
}
class Reflector {
List<Assembly> assemblies = new List<Assembly> {
typeof(BitmapDecoder).Assembly
};
public IEnumerable<Type> AllSubclassesOf(Type super) {
foreach (var a in assemblies) {
foreach (var t in a.GetExportedTypes()) {
if (t.IsSubclassOf(super)) {
yield return t;
}
}
}
}
}
}
Надеюсь, кто-нибудь поправит меня, если я ошибаюсь, но я не думаю, что в WPF есть что-то подобное. Но, надеюсь, это один из многих случаев, когда прогресс в технологии сделал устаревшим то, как мы привыкли делать вещи. Как "how do I wind my digital watch?"
Насколько я понимаю, причина, по которой ImageCodecInfo.GetImageDecoders() необходим в System.Drawing, связана с клудгической природой самого System.Drawing: System.Drawing-это управляемая оболочка вокруг GDI+, которая является неуправляемой оболочкой вокруг части Win32 API. Таким образом, возможно, есть причина, по которой новый кодек будет установлен в Windows без того, чтобы .NET изначально знал об этом. А то, что возвращается из GetImageDecoders(), - это просто набор строк, которые обычно передаются обратно в System.Drawing/GDI+ и используются для поиска и настройки подходящего DLL для чтения/сохранения вашего изображения.
С другой стороны, в WPF стандартные кодеры и декодеры встроены в фреймворк и, если я не ошибаюсь, не зависят ни от чего, что не гарантировано будет установлено как часть фреймворка. Следующие классы наследуются от BitmapEncoder и доступны out-of-the-box с помощью WPF: BmpBitmapEncoder, GifBitmapEncoder, JpegBitmapEncoder, PngBitmapEncoder, TiffBitmapEncoder, WmpBitmapEncoder. Есть BitmapDecoders для всех тех же форматов, плюс IconBitmapDecoder и LateBoundBitmapDecoder.
Возможно, вы имеете дело с делом, которое я не представляю, но мне кажется, что если вам нужно использовать класс, который наследуется от BitmapEncoder, но не был включен в WPF, то это, вероятно, ваш собственный пользовательский класс, который вы установили бы вместе с вашим приложением.
Надеюсь, это поможет. Если я пропущу необходимую часть картины, пожалуйста, дайте мне знать.