我正在尝试从 .zip 存档中获取图像并将其显示在 PictureBox 中。
我有一种方法可以从存档内的文件中获取文本,但现在我只需要获取图像。我在这个网站上尝试了不同的方法,但似乎没有一个对我有用。
这是我的代码:
using System.Text;
using System.IO.Compression;
using System.Windows.Forms;
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
string zipFileFullPath = "C:\\Tester\\adv.jar";
string targetFileName = "pack.mcmeta";
string text = new string(
(new System.IO.StreamReader(
ZipFile.OpenRead(zipFileFullPath)
.Entries.Where(x => x.Name.Equals(targetFileName,
StringComparison.InvariantCulture))
.FirstOrDefault()
.Open(), Encoding.UTF8)
.ReadToEnd())
.ToArray());
}
}
基本上,我想使用相同的方法,但我希望它不是文本,而是位图
您可以简单地使用 Image.FromStream() 从
ZipArchiveEntry.Open()
返回的 DeflateStream 生成图像。
此处使用的
Image.FromStream()
重载指示使用ICM信息(颜色空间信息)可用并跳过图像验证(花费大量时间并无论如何都会抛出):
string zipFileFullPath = "[Some archive path]";
string imageFileName = "[Some Image file name]";
var entry = ZipFile.OpenRead(zipFileFullPath)
.Entries.Where(x => x.Name.Equals(imageFileName, StringComparison.InvariantCulture))
.FirstOrDefault();
Image? entryImage = null;
if (entry != null) {
using (var stream = entry.Open()) {
entryImage = Image.FromStream(stream, true, false);
};
}
从上面的示例中,您应该推断现有代码中有一些需要修复的地方。
FirstOrDefault()
返回 null
,而您没有处理此问题,这将使您的应用程序崩溃new string()
+ string.ToArray()
。 StreamReader.ReadToEnd()
已将文件内容作为字符串返回重构:
string zipFileFullPath = "C:\\Tester\\adv.jar";
string targetFileName = "pack.mcmeta";
var entry = ZipFile.OpenRead(zipFileFullPath)
.Entries?.Where(x => x.Name.Equals(targetFileName, StringComparison.InvariantCulture))
.FirstOrDefault();
string entryTextContent = string.Empty;
if (entry != null) {
using (var reader = new StreamReader(entry.Open(), Encoding.UTF8)) {
entryTextContent = reader.ReadToEnd();
};
}
这里,StreamReader 关闭输入流