我有一个矩形,并用图像填充它
<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.MemoryBmp
或myimage.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"
这对我来说是工作:)