从压缩文件中读取.png

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

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


        }
    }
}

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

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();
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.