将图像转换为base64时图像翻转

时间:2012-12-11 06:05:58

标签: wpf base64 bitmapimage rectangles imagebrush

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

 <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 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填充选择了一张用myimage翻转的图片时。

2 个答案:

答案 0 :(得分:2)

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

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

GDI +(WinForms)世界中的编码器/解码器与WPF(DirectX)之间的支持必须有所不同....特别是如果您使用ImageFormat.MemoryBmp或{ {1}}(即在[{1}}上公开的属性)。

恰好DIB(设备无关位图)的扫描线通常以自下而上的方式存储,即颠倒(负步幅)。

所以它可能与您创建/初始化myimage.RawFormat的方式有关,这是整个过程的来源....也许您使用Image ...指向数据的位置从下到上排列的像素,反之亦然。

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

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

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

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

一些信息链接:

答案 1 :(得分:1)

我用

 FlowDirection="LeftToRight"

这对我有用:)