memorystream 相关问题

内存流是一种流,它有几种方法来访问和存储内存中的数据。

如何在 C++/WinRT (WinUI3) 中将图像从内存读取到 ImageSource?

[1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我应该怎么办?图像格式可以是JPG、BMP或PNG之一。 [1] 我想在 XAML 中显示 Image 控件的图像,但该图像来自字节数组。 我该怎么办?图像格式可以是 JPG、BMP 或 PNG 之一。 <Image x:Name="img"/> void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data img().Source(???); // what should I do? } [2] 我尝试了InMemoryRandomAccessStream,但没有成功。 我知道在C#中使用MemoryStream很方便,但是如何在C++中实现它? 另一个问题是这个方法是否也适用于JPG和PNG格式的图像? void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; // How to read data from stream? bmp.SetSource(stream); img().Source(bmp); } [3] 现在功能已经实现了,但是还有两个问题 IAsyncAction MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; winrt::Windows::Storage::Streams::InMemoryRandomAccessStream stream; winrt::Windows::Storage::Streams::DataWriter dw(st.GetOutputStreamAt(0ULL)); dw.WriteBytes({ buf, size }); // This is very inefficient! co_await dw.StoreAsync(); dw.Close(); bmp.SetSource(stream); img().Source(bmp); stream.Close(); } 首先,我发现DataWriter::WriteBytes()确实是在复制数据。但我认为ImageSource只需要从我的buf中读取即可,不需要在读取之前将整个图像完全复制到流中。也许是类似MemoryView的东西,我这样想是不是错了? 其次,DataWriter和InMemoryRandomAccessStream的Close()应该在哪里调用? BitmapImage需要释放内存吗?这里有一个异步函数,我不知道应该写在哪里 [4] 根据IInspectable,我尝试了SHCreatMemStream并搜索了大量信息以提出另一个解决方案。目前的问题是,与方法[3]同样可行,但仍然会出现内存分配问题。 #include "Shlwapi.h" #include "shcore.h" #pragma comment(lib, "shlwapi.lib") void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&) { unsigned long long size; // iamge data size const unsigned char* buf; // image data winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bmp; IStream* stream{ SHCreateMemStream(buf, size) }; // Copying takes a lot of time static const GUID guidIRandomAccessStream = { 0x905a0fe1, 0xbc53, 0x11df, { 0x8c, 0x49, 0x00, 0x1e, 0x4f, 0xc6, 0x86, 0xda } }; winrt::Windows::Storage::Streams::IRandomAccessStream pRas{ }; CreateRandomAccessStreamOverStream(stream, BSOS_OPTIONS::BSOS_DEFAULT, guidIRandomAccessStream, (void**)&pRas); bmp.SetSource(stream); img().Source(bmp); } 通过性能测试,发现CreateRandomAccessStreamOverStream的时间是一致的,但是SHCreateMemStream消耗的时间与图像大小成正比。可以得出,SHCreateMemStream中创建流的过程也涉及到内存的复制。 我对Windows编程中的Stream不是特别熟悉。创建流的过程一定会涉及到内存复制吗?从内存加载图像可以避免额外的开销吗?还有没有类似MemoryStreamView的结构来替代吗? 还有一个问题,我知道新的图像肯定需要内存存储。 BitmapImage设置Stream为Source会接管Stream占用的内存吗? Image控件设置BitmapImage作为Source会接管BitmapImage占用的内存吗? 如果是这样的话,我可以接受Stream分配新的内存,否则仍然是一个效率问题。 谢谢!!!!!!! 使用Stream已经彻底解决了这个问题。如前四期所述。 至于附加问题: ★1 使用 CreatStreamOnHGlobal 而不是 SHCreatMemStream。 因为SHCreatMemStream在调用过程中会对传入的内存块参数进行另一次内存复制。 CreatStreamOnHGlobal 创建流后不执行内存复制。您可以先通过GlobalAlloc分配内存,写入所需的图像数据,然后调用CreatStreamOnHGlobal,无需任何时间开销。另外,可以将CreatStreamOnHGlobal的第二个参数设置为true,自动释放GlobalAlloc分配的内存。 通过进程内存监控,我发现对于同一个程序,使用CreatStreamOnHGlobal的速度是SHCreatMemStream的两倍,并且不会导致内存泄漏。 ★2 创建的Stream需要调用Release方法减少一个引用。 IRandomAccessStream作为局部变量,会自动析构,无需主动释放。 并且BitmapImage还管理一部分引用,这些引用在离开作用域后被释放。 通过测试COM对象上Release方法的返回值,发现整个程序结束后引用计数又回到了0

回答 1 投票 0

为什么System.Text.Json无法序列化MemoryStream?

我有一个带有 MemoryStream 属性的类。当我尝试使用 System.Text.Json 序列化它时,出现异常: “System.InvalidOperationException”类型的未处理异常 占据...

回答 1 投票 0

C# 合并多个内存流并通过filestreamresult返回,仅显示最后一个内存流

我正在尝试将多个 pdf 文件合并到一个内存流中,并将其与 FileStreamResult 一起返回到 Web 应用程序。 我的代码是这样的: 字符串内容类型=“应用程序/pdf”; ...

回答 1 投票 0

在 Delphi 2009 中将 TMemoryStream 转换为“字符串”

在 Delphi 2009 之前我们有以下代码: 函数 MemoryStreamToString(M : TMemoryStream): 字符串; 变量 新容量:Longint; 开始 如果 (M.Size = > 0) 或 (M.Memory = nil) 那么

回答 8 投票 0

使用 AES c# 进行图像加密

我必须通过AES每种算法对图像进行加密和解密。 我有以下加密图像的代码: public static byte[] MakeEncryption(Image image, CipherMode mode, byte[] key, byte[] iv) ...

回答 1 投票 0

大文件上传会导致文件损坏

我目前正在应用程序中开发文件上传功能,但遇到上传的文件似乎已损坏的问题。该应用程序旨在处理大文件...

回答 1 投票 0

MemoryStream 在 .Net 4.8 中造成内存泄漏

我尝试编写一个基于MemoryStream和字节数组的.Net 4.8程序。当我尝试将字节数组写入内存流并处置 MemoryStream 时,我发现只有一半......

回答 1 投票 0

如何从 MemoryStream 中获取字符串?

如果给我一个我知道已填充字符串的 MemoryStream,我如何取回字符串?

回答 13 投票 0

Aspose.Pdf.Document.Save() 与 MemoryStream 一起使用时会抛出“System.InvalidOperationException”类型的异常

我们正在尝试使用 Aspose.Pdf.Document.Save() 方法保存 PDF 文档。我们的代码在作为 .netcore3.1 运行时可以工作,但我们已升级到 .NET6,但现在失败了。我们的 Aspose 版本...

回答 1 投票 0

将 ZipArchive 保存到 Stream

我正在开发一个项目,我更新 ZipArchive 并将其上传回服务器,但我只能使用流上传它。 公共 IActionResult DeleteZippedFile(字符串路径) { //读取zip f...

回答 1 投票 0

反序列化会引发这段 C# 代码的异常 [已关闭]

我读入了一些二进制数据。我希望将其转换为 System.Drawing.Image,因此我创建了一个 Image 对象的实例,使用内存流作为输入数据。 完成之后,我

回答 3 投票 0

对象序列化和IDisposable

公共静态字符串SerializeObject(T obj) { 尝试 { 字符串 xmlString = null; MemoryStream 内存流 = new MemoryStream(); ...

回答 5 投票 0

将 4000 万条记录从 csv 流转换为制表符分隔文本流时出现内存不足异常

我正在尝试将 csv 流转换为制表符分隔的文本内存流,当它尝试写入流时,它给了我内存不足异常的错误,它正在本地 ma 中进行处理...

回答 1 投票 0

MemoryStream 生成 CSV 字符串时会带来一半数据

我确实有一个非常简单的问题,但需要很多时间才能找到解决方案。还是没找到,就想在这里发帖。 下面是获取 CSV 格式字符串的代码。但这是...

回答 2 投票 0

如何在 C# 中从刚刚写入的流中读取数据而不调用 Flush()

我有一些使用第三方库 EDIFabric 的代码,它写入流,我需要捕获该输出并使用它通过 StreamReader 返回字符串。 // 构建

回答 1 投票 0

如何将 MemoryStream 中的 PDF 发送到 .Net 中的打印机?

我使用 iTextSharp 在内存中创建了一个 PDF,并将其包含在 MemoryStream 中。我现在需要将 MemoryStream PDF 转换为打印机可以理解的内容。 我在...

回答 2 投票 0

如何从具有特定起始字符串的内存流中删除数据

在将其写入 Word 文档模板之前,我必须从 Memorystream 中删除以特定字符串开始一直到流末尾的数据。 我尝试过以下方法,但是当我

回答 0 投票 0

c# 如何将 IO.Stream 保存到 MemoryStream 并保存到本地文件夹中的 PDF 文件

我正在调用第三方服务,该服务通过 IO.Stream 返回 pdf 文件。我需要更改为 MemoryStream,并保存为 pdf 文件。

回答 2 投票 0

添加为 smtp 的 MailAttachment 后无法正确呈现 Exchange 电子邮件附件

我需要将 EmailMessage 转换为 MailMessage 以进行 smtp 邮件发送。但如果附件是 .docx、.txt、.jpg 等文件,它会正确显示。我面临的问题是

回答 1 投票 0

将类型“System.Drawing.Image”转换为“System.Windows.Media.ImageSource”

我需要一些关于如何将“System.Drawing.Image”转换为“System.Windows.Media.ImageSource”的帮助 在下面的代码中,var responseImage = System.Drawing.Image.FromStream(responseStream);是一个系统。

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.