相关疑难解决方法(0)

如何使用Java中的tEXt或iTXt块保存PNG?

我目前正在使用javax.imageio.ImageIO来编写PNG文件.我想包括一个tEXt块(实际上是这里列出的任何块),但是看不到这样做的方法.

通过com.sun.imageio.plugins.png.PNGMetadata的外观,它应该是可能的.

我应该非常感谢任何线索或答案.

M.

java png text javax.imageio

11
推荐指数
1
解决办法
3973
查看次数

如何在文件的一部分上使用DeflateStream?

我正在研究另一个问题的解决方案,即在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)

.net c# compression png deflate

3
推荐指数
1
解决办法
4173
查看次数

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

我有二进制文件,每次包含每个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)

c# binary png binaryfiles binary-data

2
推荐指数
2
解决办法
4766
查看次数

标签 统计

png ×3

c# ×2

.net ×1

binary ×1

binary-data ×1

binaryfiles ×1

compression ×1

deflate ×1

java ×1

javax.imageio ×1

text ×1