我目前正在使用javax.imageio.ImageIO来编写PNG文件.我想包括一个tEXt块(实际上是这里列出的任何块),但是看不到这样做的方法.
通过com.sun.imageio.plugins.png.PNGMetadata的外观,它应该是可能的.
我应该非常感谢任何线索或答案.
M.
我正在研究另一个问题的解决方案,即在PNG的'zTXt'块中读取数据.我就是在文件中找到块,并阅读zTXt的关键字.我在阅读zTXt的压缩部分时遇到问题.我之前从未使用过DeflateStream对象,并且遇到了一些问题.在读取时,似乎期望长度参数为"未压缩"字节.但就我而言,我只知道"压缩"字节中数据的长度.为了解决这个问题,我将需要解压缩的所有数据放入MemoryStream中,然后使用DeflateStream"读取结束".现在这只是peachy,除了它抛出一个InvalidDataException,消息"块长度与其补码不匹配".现在我不知道这意味着什么.怎么可能出错?
块的格式是ID("zTXt")的4个字节,数据长度的大端32位int,数据,最后是CRC32校验和,我现在忽略它.
zTXt块的格式首先是以null结尾(字符串作为关键字),然后是压缩方法的一个字节(总是0,DEFLATE方法),其余数据是压缩文本.
我的方法接受一个新的FileStream,并返回一个包含zTXt关键字和数据的字典.
这是现在的怪物:
public static List<KeyValuePair<string, string>> GetZtxt(FileStream stream)
{
var ret = new List<KeyValuePair<string, string>>();
try {
stream.Position = 0;
var br = new BinaryReader(stream, Encoding.ASCII);
var head = br.ReadBytes(8); // The header is the same for all PNGs.
if (!head.SequenceEqual(new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A })) return null; // Not a PNG.
while (stream.Position < stream.Length) {
int len; // Length of chunk data.
if (BitConverter.IsLittleEndian)
len = BitConverter.ToInt32(br.ReadBytes(4).Reverse().ToArray(), …Run Code Online (Sandbox Code Playgroud) 我有二进制文件,每次包含每个PNG文件(二进制文件不是DLL,不是EXE,没什么常见的,只是包含不同文本信息的文件,PNG文件和其他一些东西.格式文件对我来说是未知的.PNG文件可以显示一个执行此类文件的程序).我没有这个程序的来源做这些文件.我的任务是从二进制文件中提取此PNG文件以显示它或将其保存为PNG.我写了一个代码,它可以处理这些文件中的一部分(比如大约50%的文件),但不是.在不工作的文件上,创建此文件的程序仍然可以显示包含的图像,因此图像在每个文件内部确实有效 - 但无论如何我的代码对某些文件不起作用.
有些图像似乎可能有另一种格式,可能是编码类型(我已尝试过所有不同的编码类型,没有成功).这是我的代码(我希望有人可以告诉我改变什么,图像变得可读).
我的代码是什么:它找到PNG图像"‰PNG"的已知起始字符串和已知的结束字符串"IEND®B`".这个字符串在我的任何二进制文件中都包含PNG.然后我的代码获取开始和结束之间的字符串+开始和结束序列,并使用Encoding.Default将其保存到文件中.大多数通过这种方式提取的PNG文件可以使用图像查看器显示,但大约50%是无效的.如果我用编辑器打开它并将字符与工作图像进行比较,则图像看起来没问题.Sofar我不知道哪个符号是错误图像格式的原因.
如果需要我会提供更多信息,这里是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我还首先考虑使用二进制方法获取PNG并使用此代码,但我只是读取字符串时得到了完全相同的结果.这是我早期的代码.我使用字符串来搜索字节数组中的位置进行比较.我对二进制代码没有运气...
byte[] by;
// 1.
// Open file with a BinaryReader.
using (BinaryReader b = new …Run Code Online (Sandbox Code Playgroud) png ×3
c# ×2
.net ×1
binary ×1
binary-data ×1
binaryfiles ×1
compression ×1
deflate ×1
java ×1
text ×1