我有一个矩形并用图像填充
<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翻转的图片时。
答案 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
或ImageFormat
类(因此您在序列化过程的两端使用了相同类型的类),但随后将该对象转换为{{1对象。如果您可以提供有关如何创建传入Bitmap
的更多详细信息,这将有助于您从文件中加载它(它的格式是什么?),或者您创建了一个,然后通过System.Drawing.Image
上下文,或者您使用了CopyPixels并从某处复制了原始像素数据(例如,从DIB中通常存储扫描线的底部到顶部)。
一些信息链接:
答案 1 :(得分:1)
我用
FlowDirection="LeftToRight"
这对我有用:)