С помощью 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;
        }
Другие вопросы по тегам