gpt4 book ai didi

c# - 如何获取已安装的位图编码器/解码器列表(WPF 世界)?

转载 作者:可可西里 更新时间:2023-11-01 09:13:58 41 4
gpt4 key购买 nike

在 WindowsForms 世界中,您可以获得可用图像编码器/解码器的列表

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 属性来获得更好的名称。该类(class)将为您提供人类可读的名称以及其他事实。

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

关于c# - 如何获取已安装的位图编码器/解码器列表(WPF 世界)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com