С помощью HelixToolkit.SharpDX.Wpf как мне установить DiffuseMap для PhongMaterial из ImageSource?
Свойство DiffuseMap PhongMaterial принимает поток.
Если у меня есть ImageSource, как мне преобразовать его во что-то приемлемое для свойства? Обратите внимание, что я должен быть в состоянии сделать это быстро, в памяти.
В примерах из исходного кода я могу найти только примеры загрузки изображений из файла:
var image = LoadFileToMemory(new System.Uri(@"test.png", System.UriKind.RelativeOrAbsolute).ToString());
this.ModelMaterial = new PhongMaterial
{
AmbientColor = Colors.Gray.ToColor4(),
DiffuseColor = Colors.White.ToColor4(),
SpecularColor = Colors.White.ToColor4(),
SpecularShininess = 100f,
DiffuseAlphaMap = image,
DiffuseMap = LoadFileToMemory(new System.Uri(@"TextureCheckerboard2.dds", System.UriKind.RelativeOrAbsolute).ToString()),
NormalMap = LoadFileToMemory(new System.Uri(@"TextureCheckerboard2_dot3.dds", System.UriKind.RelativeOrAbsolute).ToString()),
};
LoadFileToMemory просто берет байты из файла и возвращает его как MemoryStream.
1 ответ
Решение
Под ImageSource вы подразумеваете BitmapSource или DrawingImage? ImageSource - абстрактный базовый класс для них обоих. Если у вас есть BitmapSource, вы можете преобразовать его в MemoryStream, используя:
private Stream BitmapSourceToStream(BitmapSource writeBmp)
{
Stream stream = new MemoryStream();
//BitmapEncoder enc = new PngBitmapEncoder();
//BitmapEncoder enc = new JpegBitmapEncoder();
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(writeBmp));
enc.Save(stream);
return stream;
}