Verbindliche Bild.Quell-String in WPF?
Habe ich unter XAML-code :
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
WindowStartupLocation="CenterScreen"
Title="Window1" Height="300" Width="300">
<Grid>
<Image x:Name="TestImage" Source="{Binding Path=ImageSource}" />
</Grid>
</Window>
Auch, es ist eine Methode, die ein Bild von einem Base64
string :
Image Base64StringToImage(string base64ImageString)
{
try
{
byte[] b;
b = Convert.FromBase64String(base64ImageString);
MemoryStream ms = new System.IO.MemoryStream(b);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
//////////////////////////////////////////////
//convert System.Drawing.Image to WPF image
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(img);
IntPtr hBitmap = bmp.GetHbitmap();
System.Windows.Media.ImageSource imageSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
Image wpfImage = new Image();
wpfImage.Source = imageSource;
wpfImage.Width = wpfImage.Height = 16;
//////////////////////////////////////////////
return wpfImage;
}
catch
{
Image img1 = new Image();
img1.Source = new BitmapImage(new Uri(@"/passwordManager;component/images/TreeView/empty-bookmark.png", UriKind.Relative));
img1.Width = img1.Height = 16;
return img1;
}
}
Nun, ich bin gonna binden TestImage
dem Ausgang Base64StringToImage
- Methode.
Ich habe die folgende Weise :
public string ImageSource { get; set; }
ImageSource = Base64StringToImage("iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABjUExURXK45////6fT8PX6/bTZ8onE643F7Pf7/pDH7PP5/dns+b7e9MPh9Xq86NHo947G7Hm76NTp+PL4/bHY8ojD67rc85bK7b3e9MTh9dLo97vd8/D3/Hy96Xe76Nfr+H+/6f///1bvXooAAAAhdFJOU///////////////////////////////////////////AJ/B0CEAAACHSURBVHjaXI/ZFoMgEEMzLCqg1q37Yv//KxvAlh7zMuQeyAS8d8I2z8PT/AMDShWQfCYJHL0FmlcXSQTGi7NNLSMwR2BQaXE1IfAguPFx5UQmeqwEHSfviz7w0BIMyU86khBDZ8DLfWHOGPJahe66MKe/fIupXKst1VXxW/VgT/3utz99BBgA4P0So6hyl+QAAAAASUVORK5CYIII").Source.ToString();
aber nichts passiert.
Wie kann ich es beheben ?
BTW, ich bin tot sicher, dass der base64-string korrekt ist
- Nicht relevant für Ihre Frage, aber Sie haben versucht, laden Sie das Bild mit
var img = new BitmapImage { StreamSource = ms }
? - NEIN, habe ich nicht. aber, Warum habe ich das getan ?
- Gut, Sie können laden Sie das Bild direkt mit WPF, statt über GDI+ (System.Zeichnung). Weil es dazu genutzt werden, um XAML, die Sie tatsächlich zu tun haben
var source = new BitmapImage(); source.BeginInit(); source.StreamSource = ms; source.EndInit()
. - Ich stellte fest, dass ImageSource="resources\refresh.png" funktioniert nicht, aber ImageSource="\resources\refresh.png" tut, wo ImageSource ist eine dependencyproperty. In der Erwägung, dass Source="resources\refresh.png" direkt in einem Image-Steuerelement funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Ergänzung zu @itowlson ausgezeichnete Antwort, dies ist, was Ihr code sollte wie folgt Aussehen:
WpfApplication1.MainModel
. Sie können der download für mein Projekt von mediafire.com/?nze3qjmzjtmDataContext = model;
, nichtContent = model;
. Sie können auch verwendenConvert.FromBase64String(...)
direkt inSetImageData()
,BitmapImage
laden kann, die gleichen Bilder wieSystem.Drawing.Image
.Lassen Sie uns brechen, was du tust.
Für diese Arbeit, die verbindliche Quelle muss entweder ein ImageSource, oder ein string, der einen URI zu einem Bild-Datei. Werfen wir also einen Blick auf, was die ImageSource-Eigenschaft eigentlich ist.
Ein problem hierbei ist, dass die Bildquelle nicht anheben PropertyChanged-events. Also WPF aktualisieren wird nicht das verbindliche Ziel, wenn Sie aktualisieren die Eigenschaft.
Aber auch, ImageSource nicht ImageSource, es ist ein string. Das ist okay, aber WPF ist gehend zu interpretieren, dass string als URI. Was ist URI?
Dies ist der Kern des Problems. Die ImageSource-string ist nicht wirklich ein URI, weil sich Ihr Bild ist nicht eine adressierbare Ressource. Base64StringToImage erstellt eine in-memory ImageSource von der base64-string, dann wieder ein Bild mit, dass als Quelle. Dann nehmen Sie das Bild der Quelle (das ist ein ImageSource-Objekt), und stringise, dass. Das könnte funktionieren, wenn die Bildquelle gekommen war, aus einer Datei oder URL, aber es ging nicht: es kam von einem HBITMAP. So das Ergebnis von ToString() wird bedeutungslos sein. So ImageSource wird etwas sinnlos, und Ihr Bild wird versucht, diese zu interpretieren sinnlose Sache wie die URL einer bitmap-Datei.
So, dies zu beheben, müssen Sie drei Dinge tun:
Base64StringToImage(...).Source
-- d.h. entfernen Sie die ToString () - Aufruf. Besser noch, ändern Base64StringToImage zu schicken, ImageSource, anstatt ein Bild: erstellen eines Bild-Elements erzeugt nur Aufwand, da alles, was Sie wirklich interessiert, ist die BitmapSource.Image.Source
können auch gebunden werden, um eineStream
oderbyte[]