我正在寻找一种方法来获取和设置 PNG 文件中的那些奇怪的块,即在我的情况下,'zTXt' 块。.Net 框架或任何其他已知程序集是否内置了任何内容来提供对这些数据的访问?如果已经完成,我想避免为此目的编写整个 PNG 读取器/写入器。
谢谢!
进度更新: 经过更多搜索后,似乎没有为我想要完成的任务预先制作任何内容。我现在正在尝试自己通读文件,但是在处理数据的压缩部分时遇到了问题。我在这里针对这个特定问题提出了另一个问题:如何在文件的一部分上使用 DeflateStream?
一旦我得到这个工作,我会在这里发布代码作为自己的答案。(当然,除非有人打败我。)
我有一个包含多个复选框输入元素的页面.切换这些会以一种只能在Javascript中完成的方式改变页面的外观.
当您关闭并重新打开页面时,我的问题就出现了.页面加载后的短暂(看似不一致)时刻,Firefox会恢复复选框的状态,而不会提升其onchange事件.
有没有办法确定Firefox何时恢复这些元素,或者至少是否有任何方法可以禁用此功能而无需用户更改其浏览器设置?
我也在使用jQuery,以防有任何可以帮助的东西.
autocomplete="off"在输入上使用无效.
我正在研究另一个问题的解决方案,即在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)