Использование чанков в PNG

Я ищу способ получить и установить эти странные куски в файле PNG, а именно, в моем случае, кусок 'zTXt'. Есть ли что-то встроенное в.Net Framework или любую другую известную сборку, которая обеспечивает доступ к этим данным? Я хотел бы избежать необходимости писать для этой цели целый читатель / писатель PNG, если это уже было сделано.

Спасибо!

Обновление прогресса: после дополнительных поисков, кажется, ничего не сделано для того, чего я хочу достичь. Я сейчас пытаюсь сам прочитать файл, но у меня проблемы со сжатой частью данных. Я задал еще один вопрос для этой конкретной проблемы: как использовать DeflateStream для части файла?

Как только я получу это, я выложу код здесь как ответ сам. (Если, конечно, кто-то другой не победит меня)

3 ответа

Решение

Следующее должно работать: http://sourceforge.net/projects/pngnet/ Проверьте это с помощью Subversion. Это библиотека для низкоуровневого доступа к png-файлам и небольшой пример на C#.

Это должен быть.net? Вот некоторый рубиновый код, чтобы прочитать куски и снова записать их. Вставьте свою обработку в середине

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

Вот код, аккуратно написанный на Java, для чтения всего PNG. Он довольно маленький, и вы сможете выбрать то, что вам нужно.

Я думаю, что перевод его с # будет достаточно простым

Другие вопросы по тегам