Загрузить файл DDS из потока и отобразить в приложении WPF?
Я пытаюсь загрузить файл DirectDraw Surface (DDS) и отобразить его в приложении WPF. Вот как я получаю поток из zip-архива:
using (ZipArchive clientArchive = ZipFile.OpenRead(levelsPath + mapName + @"\client.zip"))
{
var entry = clientArchive.GetEntry("hud/minimap/ingamemap.dds");
var stream = entry.Open();
}
Теперь, как мне отобразить изображение DDS (только первое, самое высокое качество mipmap) в моем приложении WPF?
2 ответа
Недавно я использовал класс DDSImage из kprojects. Он может загружать файлы DDS DXT1 и DXT5.
Просто создайте новый экземпляр с байтовым массивом и получите доступ ко всем mipmaps через свойство images
типа Bitmap[]
:
DDSImage img = new DDSImage(File.ReadAllBytes(@"e:\myfile.dds"));
for (int i = 0; i < img.images.Length; i++)
{
img.images[i].Save(@"e:\mipmap-" + i + ".png", ImageFormat.Png);
}
Если у вас есть ваш mipmap как Bitmap, вы можете отобразить его с помощью Image- Control. Чтобы создать BitmapSource, основанный на Bitmap в памяти, этот ответ указал мне правильный путь.
using (ZipArchive clientArchive = ZipFile.OpenRead(levelsPath + mapName + @"\client.zip"))
{
var entry = clientArchive.GetEntry("hud/minimap/ingamemap.dds");
var stream = entry.Open();
ImageObject.Source = DDSConverter.Convert(stream,null,null,null);
}
Взято отсюда.
public class DDSConverter : IValueConverter
{
private static readonly DDSConverter defaultInstace = new DDSConverter();
public static DDSConverter Default
{
get
{
return DDSConverter.defaultInstace;
}
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
else if (value is Stream)
{
return DDSConverter.Convert((Stream)value);
}
else if (value is string)
{
return DDSConverter.Convert((string)value);
}
else if (value is byte[])
{
return DDSConverter.Convert((byte[])value);
}
else
{
throw new NotSupportedException(string.Format("{0} cannot convert from {1}.", this.GetType().FullName, value.GetType().FullName));
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException(string.Format("{0} does not support converting back.", this.GetType().FullName));
}
public static ImageSource Convert(string filePath)
{
using (var fileStream = File.OpenRead(filePath))
{
return DDSConverter.Convert(fileStream);
}
}
public static ImageSource Convert(byte[] imageData)
{
using (var memoryStream = new MemoryStream(imageData))
{
return DDSConverter.Convert(memoryStream);
}
}
public static ImageSource Convert(Stream stream)
{
...
}
}
Ниже приведен простой пример использования:
<Image x:Name="ImageObject" Source="{Binding Source=Test.dds, Converter={x:Static local:DDSConverter.Default}}" />