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



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

<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>

图像是我为其设置图像的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翻转。

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

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

GDI+(WinForms)世界中的编码器/解码器与WPF(DirectX)之间的支持必须存在一些差异。特别是,如果您使用的是ImageFormat.MemoryBmpmyimage.RawFormat(即Image上公开的属性),则可能会遇到问题。

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

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

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

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

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

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

)。一些信息链接:

  • C# 如何写入位图数据。是自下而上还是自上而下?
  • http://msdn.microsoft.com/en-GB/library/Windows/desktop/dd407212(v=vs.85).aspx

我使用

FlowDirection="LeftToRight"

这对我来说是工作:)

最新更新