我正在尝试从 .zip 中获取图像并将其放入图片框中,我有一种方法可以从 zip 内的文件中获取文本,但现在我只需要获取图像,我在这个网站上尝试了不同的方法但似乎没有一个对我有用。这是我的代码
using System.Text;
using System.IO.Compression;
using System.Windows.Forms;
namespace MCMM
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
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());
}
private void getimg()
{
}
}
}
基本上我想使用相同的方法,但我希望它不是文本,而是位图
您可以简单地使用 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();
};
}