0

我有一个矩形并用图像填充它

 <Rectangle Height="95" Fill="{Binding Path=Image,RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay,Converter={StaticResource ConvertBase64toImage}}" Stroke="{x:Null}" x:Name="EditPhotoRectangel">
       <Rectangle.BitmapEffect>
           <DropShadowBitmapEffect ShadowDepth="7" Softness="0.75"/>
       </Rectangle.BitmapEffect>
 </Rectangle>

Image 是一个 base64 字符串,我为它设置了图像。

 private string ImageToBase64(System.Drawing.Image image, ImageFormat format)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
    }

并使用转换器将 Base64 转换为 imagebrush 以填充矩形。

 ImageBrush brush = new ImageBrush();
 BitmapImage bitmap = new BitmapImage();
 // convert base64string to byte[].
 byte[] binaryData = System.Convert.FromBase64String((string)value);
 bitmap.BeginInit();
 // Initializes a new non-resizable instance of the MemoryStream class based on the binaryData array.
 bitmap.StreamSource = new MemoryStream(binaryData);
 bitmap.EndInit();
 //set bitmapimage for brush imagesource 
 brush.ImageSource = bitmap;
 return brush;

我的问题是:当我为这个Rectangle填充选择一个图像时,我的图像翻转。

4

2 回答 2

2

这只是一个疯狂的猜测......需要写一个样本来确认......

我注意到您正在使用System.Drawing.Image对源位图二进制数据进行编码以及System.Windows.Media.BitmapImage对二进制数据进行反序列化。

GDI+ (WinForms) 世界中的编码器/解码器和 WPF (DirectX) 之间的支持肯定存在一些差异......特别是如果您使用ImageFormat.MemoryBmp, 或myimage.RawFormat(即暴露在 上的属性),您可能会遇到问题Image

碰巧的是,DIB(与设备无关的位图)通常将其扫描线以自下而上的方式存储,即倒置(负步幅)。

因此,这可能与您创建/初始化的方式有关System.Drawing.Bitmap,这是整个过程的来源……也许您使用CopyPixels了……它指向了像素从下到上排列的数据,反之亦然。

您是否尝试过.Save对该传入的物理 BMP 或 JPEG 文件执行操作,Bitmap以查看它是否正确(您甚至可以在调试器中执行此操作)。

如果您无法追查此转换失败的原因,那么一些可能的解决方案是:

  • 进行必要的转换以将图像翻转回适当的方式或
  • 使用不同的ImageFormat/以不同的方式创建传入Bitmap
  • 当您将 base64 数据反序列化回位图时,System.Drawing.Image再次使用该类(因此您在序列化过程的两端使用了相同类型的类),然后将该对象转换为BitmapImage对象。

如果您可以提供有关如何创建传入的更多详细信息,System.Drawing.Bitmap这将有所帮助,即您是从文件中加载它(它是哪种格式?),或者您创建了一个然后通过Graphics上下文绘制到它,或者您使用 CopyPixels 并复制来自某处的原始像素数据(例如,来自通常存储从下到上的扫描线的 DIB)。

一些信息链接:

于 2012-12-11T19:48:44.157 回答
1

我用

 FlowDirection="LeftToRight"

这对我有用:)

于 2012-12-19T06:38:47.853 回答