C# 如何在codebehind中将StreamSource分配给BitmapImage?
我有一个zip文件,其中存储了流程文档(Card.xaml)和带有图像的文件夹(媒体)。myFlowDocument中的图像具有标记,其中存储它们相对于FlowDocument的路径。对于FlowDocument中的图像搜索(FindImages方法): 如何在RichTextBox中打开此拉链。请注意我如何创建此图像(位图),可能存在问题,但我无法理解问题所在:C# 如何在codebehind中将StreamSource分配给BitmapImage?,c#,wpf,xaml,C#,Wpf,Xaml,我有一个zip文件,其中存储了流程文档(Card.xaml)和带有图像的文件夹(媒体)。myFlowDocument中的图像具有标记,其中存储它们相对于FlowDocument的路径。对于FlowDocument中的图像搜索(FindImages方法): 如何在RichTextBox中打开此拉链。请注意我如何创建此图像(位图),可能存在问题,但我无法理解问题所在: string nameOfXamlCardDefault = "Card.xaml"; private void Open_
string nameOfXamlCardDefault = "Card.xaml";
private void Open_Executed(object sender, ExecutedRoutedEventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == true)
{
//Open zip file
using (FileStream fullCardZipFile = File.Open(dlg.FileName, FileMode.Open, FileAccess.ReadWrite))
{
//Open zip by ZipArchive
using (ZipArchive archive = new ZipArchive(fullCardZipFile, ZipArchiveMode.Update))
{
//Get entry for xaml (FlowDocument)
ZipArchiveEntry xamlFileEntry = archive.GetEntry(nameOfXamlCardDefault);
//Open xaml
using (Stream xamlFileStreamInZip = xamlFileEntry.Open())
{
//Load FlowDocument into rtbEditor.Document
rtbEditor.Document = XamlReader.Load(xamlFileStreamInZip) as FlowDocument;
//Searching images
List<Image> images = FindImages(rtbEditor.Document).ToList();
foreach (var image in images)
{
var imageFileEntry = archive.GetEntry(image.Tag.ToString());
var bitmap = new BitmapImage();
using (Stream imageFileStream = imageFileEntry.Open())
{
var memoryStream = new MemoryStream();
imageFileStream.CopyTo(memoryStream);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = memoryStream;
bitmap.EndInit();
image.Source = bitmap;
}
}
}
}
}
}
return;
}
XamlCardDefault=“Card.xaml”的字符串名称;
私有void Open_已执行(对象发送方,已执行路由目标)
{
OpenFileDialog dlg=新建OpenFileDialog();
if(dlg.ShowDialog()==true)
{
//打开压缩文件
使用(FileStream fullCardZipFile=File.Open(dlg.FileName,FileMode.Open,FileAccess.ReadWrite))
{
//通过拉链打开拉链
使用(ZipArchive存档=新ZipArchive(fullCardZipFile,ZipArchiveMode.Update))
{
//获取xaml(FlowDocument)的条目
ZipArchiveEntry xamlFileEntry=archive.GetEntry(XamlCardDefault的名称);
//开放xaml
使用(Stream xamlFileStreamInZip=xamlFileEntry.Open())
{
//将FlowDocument加载到rtbEditor.Document中
rtbEditor.Document=XamlReader.Load(xamlFileStreamInZip)作为FlowDocument;
//搜索图像
List images=FindImages(rtbEditor.Document).ToList();
foreach(图像中的var图像)
{
var imageFileEntry=archive.GetEntry(image.Tag.ToString());
var bitmap=新的位图();
使用(Stream-imageFileStream=imageFileEntry.Open())
{
var memoryStream=新的memoryStream();
CopyTo(memoryStream);
bitmap.BeginInit();
bitmap.CacheOption=BitmapCacheOption.OnLoad;
bitmap.StreamSource=memoryStream;
EndInit();
image.Source=位图;
}
}
}
}
}
}
返回;
}
RichTextBox中的所有图像显示良好,但在BitmapImage中没有StreamSource。这将导致以后出现错误:
<FlowDocument xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" NumberSubstitution.CultureSource="User" AllowDrop="True" PagePadding="5,0,5,0">
<Paragraph>
<Image Tag="Media/image0.png">
<Image.Source>
<BitmapImage CacheOption="OnLoad" BaseUri="{x:Null}"/>
</Image.Source>
</Image>
<Image Tag="Media/image1.png">
<Image.Source>
<BitmapImage CacheOption="OnLoad" BaseUri="{x:Null}"/>
</Image.Source>
</Image>
</Paragraph>
如果只是复制图像并粘贴到RichTextBox,那么它看起来是这样的,这很好:
<Image Height="400" Width="600">
<Image.Source>
<BitmapImage CacheOption="OnLoad" UriSource="./Image1.bmp"
BaseUri="pack://payload:,,wpf1,/Xaml/Document.xaml"/>
</Image.Source>
是否可以像复制和粘贴一样从zip嵌入图像?我尝试使用剪贴板并使用MemoryStream。但是它没有帮助。在复制位图数据后,您应该通过设置其
位置
属性或调用其Seek()
方法来倒带MemoryStream
var imageFileEntry = archive.GetEntry(image.Tag.ToString());
if (imageFileEntry != null)
{
using (var imageFileStream = imageFileEntry.Open())
using (var memoryStream = new MemoryStream())
{
imageFileStream.CopyTo(memoryStream);
memoryStream.Position = 0; // here
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = memoryStream;
bitmap.EndInit();
image.Source = bitmap;
}
}
您还可以从流中解码位图帧,而不是位图图像
var imageFileEntry = archive.GetEntry(image.Tag.ToString());
if (imageFileEntry != null)
{
using (var imageFileStream = imageFileEntry.Open())
using (var memoryStream = new MemoryStream())
{
imageFileStream.CopyTo(memoryStream);
memoryStream.Position = 0;
image.Source = BitmapFrame.Create(
memoryStream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
建议的解决方案有效吗?@Clemens没有。但我知道我试图重新发明轮子。XamlPackage可以完美地完成这项工作。我以前知道XamlPackage,但最近我发现它只是一个zip文件。我应该以某种方式结束这个问题吗?也许你知道这个:??