使用mvvm从Image Control获取加载的Image

问题描述 投票:0回答:1

我在检索WPF图像控件中显示的图像时遇到问题

<Image x:Name="img" RenderTransformOrigin="0.5, 0.5" Source="{Binding ImageSource, Source={x:Static vm:ItemProvider.instance}, UpdateSourceTrigger=PropertyChanged}" >
                                            <Image.RenderTransform>
                                                <RotateTransform CenterX="0" CenterY="0" Angle="{Binding ElementName=ScrollBar, Path=Value}" />
                                            </Image.RenderTransform>

                                        </Image>

我使用Scrollbar旋转图像

我想检索它,如控件中所示

这是我如何将图像加载到图像控件

        private byte[] _ImageSource;
        public byte[] ImageSource
        {
            get { return _ImageSource; }
            set
            {
                _ImageSource = value;
                RaisePropertyChanged("ImageSource");
            }
        }

我试图通过获取ImageSource来检索图像控件中显示的图像,但它们不一样。我将图像旋转90度。但是当我加载它时,返回Image是相同的。

但使用后面的代码我可以像这样访问图像

img.Source然后我将源转换为字节数组

c# wpf image mvvm
1个回答
1
投票

旋转Image元素不会在其Source属性中旋转ImageSource。

要创建旋转的ImageSource,请使用TransformedBitmap

var sourceBitmap = new BitmapImage();

using (var stream = new MemoryStream(ImageSource))
{
    sourceBitmap.BeginInit();
    sourceBitmap.CacheOption = BitmapCacheOption.OnLoad;
    sourceBitmap.StreamSource = stream;
    sourceBitmap.EndInit();
}

// This should be another view model property that the Slider is bound to.
// Only multiples of 90 degrees are valid values.
var rotationAngle = 90d;

var rotation = new RotateTransform(rotationAngle);

var rotatedBitmap = new TransformedBitmap(sourceBitmap, rotation);

为避免您必须为每次转换创建新的源位图,您应该将ImageSource属性的类型从byte[]更改为ImageSource

为了将其写回另一个byte[],请使用其中一个BitmapEncoder类,例如PngBitapEncoder

© www.soinside.com 2019 - 2024. All rights reserved.