从压缩文件中读取.png图像

问题描述 投票:0回答:1

我正在尝试从 .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());
    }
}

基本上,我想使用相同的方法,但我希望它不是文本,而是位图

c# image winforms bitmap zip
1个回答
0
投票

您可以简单地使用 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 关闭输入流

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