使用 HelixToolkit.SharpDX.Wpf 如何在 ImageSource 的 PhongMaterial 上设置 DiffuseMap?

With HelixToolkit.SharpDX.Wpf how do I set the DiffuseMap on a PhongMaterial from an ImageSource?

PhongMaterial 的 DiffuseMap 属性 接受流。

如果我有 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 只是从文件中获取字节,returns 它作为 MemoryStream。

ImageSource 是指 BitmapSource 还是 DrawingImage? ImageSource 是它们两者的抽象基础class。 如果您有 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;
        }