gpt4 book ai didi

c# - 以正确的方式从二进制文件中提取存储的 png 图像

转载 作者:行者123 更新时间:2023-11-30 19:11:27 24 4
gpt4 key购买 nike

我有一个二进制文件,一次包含一个 PNG 文件(二进制文件不是 DLL,不是 EXE,没什么特别的,只是一个包含不同文本信息的文件,一个 PNG 文件和其他一些东西。该我不知道文件的格式。PNG 文件可以用处理这种文件的程序显示)。我没有执行这些文件的程序的源代码。我现在的任务是从二进制文件中提取此 PNG 文件以显示它或将其另存为 PNG。我写了一个代码,它适用于其中一些文件(假设大约 50% 的文件),但不适用于其他文件。在不工作的文件上,创建该文件的程序仍然可以显示包含的图像,因此每个文件中的图像肯定有效 - 但无论如何我的代码对某些文件不起作用。

一些图像似乎有另一种格式,可能是编码类型(我已经尝试了所有不同的编码类型,但没有成功)。这是我的代码(我希望有人能告诉我要更改什么以使图像始终可读)。

我的代码是做什么的:它找到 PNG 图像“‰PNG”的已知起始字符串和已知结束字符串“IEND®B`‚”。这个字符串在我的任何包含 PNG 的二进制文件中都是一样的。然后我的代码获取开始和结束之间的字符串+开始和结束序列并将其保存到带有 Encoding.Default 的文件。大多数通过这种方式提取的 PNG 文件可以用图像查看器显示,但大约 50% 是无效的。如果我用编辑器打开它并将字符与工作图像进行比较,图像看起来没问题。到目前为止,我不知道哪个符号是错误图像格式的原因。

如果需要我会提供更多信息,这里是我的代码:

private void button2_Click(object sender, EventArgs e)
{
string ReadFile1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "file.dat");
string WriteFile1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "test.png");
string TMP = File.ReadAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), ReadFile1), Encoding.Default); //System.Text.Encoding.GetEncoding(1251)
int start1 = TMP.IndexOf("PNG", 0 ,StringComparison.Ordinal);
if (start1 == 0) { return; }
int end1 = TMP.IndexOf("IEND", StringComparison.Ordinal);
string PNG = TMP.Substring(start1 - 1, (end1 + 9) - start1);
File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "test.png"), PNG, Encoding.Default);
}

我也首先想到了用二进制方法获取 PNG 并使用了这段代码,但是我只读了字符串就得到了完全相同的结果。这是我之前的代码。我使用要比较的字符串在字节数组中寻找位置。我对二进制代码没有运气......

 byte[] by;
// 1.
// Open file with a BinaryReader.
using (BinaryReader b = new BinaryReader(File.Open(ReadFile1, FileMode.Open), Encoding.Default))
{
// 2.
// Variables for our position.
int pos = start1 - 1; //I determine the right positions before doing this
int required = (end1 + 9) - start1;

// 3.
// Seek to our required position.
b.BaseStream.Seek(pos, SeekOrigin.Begin);

// 4.
// Read the next 2000 bytes.
by = b.ReadBytes(required);
b.Close();
}

FileStream writeStream;
writeStream = new FileStream(WriteFile1, FileMode.Create);
BinaryWriter writeBinay = new BinaryWriter(writeStream, Encoding.Default);
writeBinay.Write(by);
writeBinay.Close(); */

最佳答案

PNG 文件是二进制文件。如果您使用某种编码读取它们,您将丢失信息并且程序的输出不再是有效的 PNG 文件。引用Using Chunks in a PNG获取更多解释和代码示例。

另请阅读 PNG Specifiaction: File structure获取详细信息。

关于c# - 以正确的方式从二进制文件中提取存储的 png 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11487741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com