Sha256: 7c3aab9198ec0a93d0b4af5586f6f9c258d96191292443de931cf87860f3ebf4

Contents?: true

Size: 1.59 KB

Versions: 17

Compression:

Stored size: 1.59 KB

Contents

#!/usr/bin/env ruby
require 'zpng'

class ZlibAppender
  def initialize image
    @image = image.is_a?(ZPNG::Image) ? image : ZPNG::Image.load(image)
  end

  def _guess_compress_method
    zdata = @image.chunks.find_all{ |c| c.is_a?(ZPNG::Chunk::IDAT) }.map(&:data).join
    puts "[.] old zdata size  = #{zdata.size}"
    9.downto(0) do |i|
      if zdata == Zlib::Deflate.deflate(@image.imagedata, i)
        puts "[.] compress_method = #{i}"
        return i
      end
    end
    9.downto(0) do |i|
      if zdata.size == Zlib::Deflate.deflate(@image.imagedata, i).size
        puts "[.] compress_method = #{i}"
        return i
      end
    end
    puts "[?] failed to guess compress method, using default".yellow
    nil
  end

  def append appendum
    m = _guess_compress_method
    new_data = @image.imagedata + appendum
    new_zdata = Zlib::Deflate.deflate(new_data, m)
    puts "[.] new zdata size  = #{new_zdata.size}"

    idats = @image.chunks.find_all{ |c| c.is_a?(ZPNG::Chunk::IDAT) }
    idats[0].data = new_zdata

    # delete other IDAT chunks, if any
    image.chunks -= idats[1..-1] if idats.size > 1

    self
  end

  def save fname
    @image.save(fname, :repack => false)
  end
end

if $0 == __FILE__
  case ARGV.size
  when 2,3
    fname, data, oname = ARGV
    oname ||= fname.chomp(File.extname(fname)) + ".out" + File.extname(fname)
    ZlibAppender.new(fname).
      append(data).
      save(oname)
    puts "[=] #{oname} saved"
  else
    bname = File.basename($0)
    puts "USAGE:"
    puts "  Append data to zlib stream:"
    puts "    #{bname} input.png <data> [output.png]"
    exit
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
zsteg-0.2.13 writers/zlib_append.rb
zsteg-0.2.12 writers/zlib_append.rb
zsteg-0.2.11 writers/zlib_append.rb
zsteg-0.2.10 writers/zlib_append.rb
zsteg-0.2.9 writers/zlib_append.rb
zsteg-0.2.8 writers/zlib_append.rb
zsteg-0.2.7 writers/zlib_append.rb
zsteg-0.2.6 writers/zlib_append.rb
zsteg-0.2.5 writers/zlib_append.rb
zsteg-0.2.4 writers/zlib_append.rb
zsteg-0.2.3 writers/zlib_append.rb
zsteg-0.2.2 writers/zlib_append.rb
zsteg-0.2.1 writers/zlib_append.rb
zsteg-0.2.0 writers/zlib_append.rb
zsteg-0.1.2 writers/zlib_append.rb
zsteg-0.1.1 writers/zlib_append.rb
zsteg-0.1.0 writers/zlib_append.rb