在PNG中使用块数据

5
我正在寻找一种获取和设置PNG文件中的奇怪块(在我的情况下是'zTXt'块)的方法。是否有任何内置于.Net框架或其他已知程序集中,提供访问这些数据的方式?如果已经完成了此目的,我想避免编写整个PNG读取器/编写器。

谢谢!

进展更新: 经过更多搜索,似乎没有预制的东西可以实现我想要的功能。我现在正试图自己阅读文件,但是在数据的压缩部分遇到了麻烦。我已经在这里为这个特定问题提出了另一个问题:如何在文件的一部分上使用DeflateStream?

一旦我解决了这个问题,我将在这里发布代码作为我的答案。(当然,除非有人先于我。)


1
有趣。我从来不知道PNG文件中可能会有块,而今天竟然有两个关于它们的问题!(另一个是关于Java的:https://dev59.com/1HRB5IYBdhLWcg3wF0DH.) - Michael Myers
3个回答

4

1

有必要使用.net吗?这里是一些Ruby代码,可以读取块并将它们重新写出。在中间插入你的处理过程。

def extract_chunk(input, output)
   lenword = input.read(4) 
   length = lenword.unpack('N')[0]
   type = input.read(4)
   data = length>0 ? input.read(length) : ""
   crc = input.read(4)
   return nil if length<0 || !(('A'..'z')===type[0,1]) 

   #modify data here.

   output.write [data.length].pack('N')
   output.write type
   output.write data
   output.write crc(data)
   return type
end

def extract_png(input, output)
    hdr = input.read(8)
    raise "Not a PNG File" if hdr[0,4]!= "\211PNG"
    raise "file not in binary mode" if hdr[4,4]!="\r\n\032\n"
    output.write(hdr)
    loop do
      chunk_type = extract_chunk(input,output)
      p chunk_type
      break if  chunk_type.nil? || chunk_type == 'IEND' 
    end
end

这非常不错,但不幸的是,这将是一个WPF应用程序,因此它需要被.Net语言访问。这让我想知道那个"IronRuby"能否将其编译成.Net程序集,但我对Ruby一无所知。 =[ - YotaXP
这里有一个 Ruby 的封装器:http://www.igvita.com/2007/04/23/invoking-ruby-in-c-net/,也许可以用得到。 - boj

0

这里是用Java编写的整洁的代码,可以读取整个PNG。它非常小巧,您应该能够挑选出您需要的内容。

我认为将其翻译成C#应该相对简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接