zpng 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem 'colorize'
6
+ gem 'hexdump'
7
+
8
+ # Add dependencies to develop your gem here.
9
+ # Include everything needed to run rake, tests, features, etc.
10
+ group :development do
11
+ gem "rspec", "~> 2.8.0"
12
+ gem "bundler", "~> 1.0.0"
13
+ gem "jeweler", "~> 1.6.4"
14
+ gem "rcov", ">= 0"
15
+ end
@@ -0,0 +1,32 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ colorize (0.5.8)
5
+ diff-lcs (1.1.3)
6
+ git (1.2.5)
7
+ hexdump (0.2.1)
8
+ jeweler (1.6.4)
9
+ bundler (~> 1.0)
10
+ git (>= 1.2.5)
11
+ rake
12
+ rake (0.9.2.2)
13
+ rcov (0.9.11)
14
+ rspec (2.8.0)
15
+ rspec-core (~> 2.8.0)
16
+ rspec-expectations (~> 2.8.0)
17
+ rspec-mocks (~> 2.8.0)
18
+ rspec-core (2.8.0)
19
+ rspec-expectations (2.8.0)
20
+ diff-lcs (~> 1.1.2)
21
+ rspec-mocks (2.8.0)
22
+
23
+ PLATFORMS
24
+ ruby
25
+
26
+ DEPENDENCIES
27
+ bundler (~> 1.0.0)
28
+ colorize
29
+ hexdump
30
+ jeweler (~> 1.6.4)
31
+ rcov
32
+ rspec (~> 2.8.0)
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Andrey "Zed" Zaikin
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,161 @@
1
+ zpng
2
+ ======
3
+
4
+
5
+ Description
6
+ -----------
7
+ A pure ruby PNG file manipulation & validation
8
+
9
+ Installation
10
+ ------------
11
+ gem install zpng
12
+
13
+ Usage
14
+ -----
15
+
16
+ # zpng -h
17
+
18
+ Usage: zpng [options]
19
+ -v, --verbose Run verbosely (can be used multiple times)
20
+ -q, --quiet Silent any warnings (can be used multiple times)
21
+ -I, --info General image info
22
+ -C, --chunks Show file chunks (default)
23
+ -A, --ascii Try to display image as ASCII (works best with monochrome images)
24
+ -S, --scanlines Show scanlines info
25
+ -P, --palette Show palette
26
+
27
+ ### Info
28
+
29
+ # zpng --info qr_rgb.png
30
+
31
+ [.] image size 35x35
32
+ [.] uncompressed imagedata size = 3710 bytes
33
+
34
+ ### Chunks
35
+
36
+ # zpng --chunks qr_aux_chunks.png
37
+
38
+ [.] #<ZPNG::Chunk IHDR size= 13, crc=36a28ef4, width=35, height=35, depth=1, color=0, compression=0, filter=0, interlace=0> CRC OK
39
+ [.] #<ZPNG::Chunk gAMA size= 4, crc=0bfc6105 > CRC OK
40
+ [.] #<ZPNG::Chunk sRGB size= 1, crc=aece1ce9 > CRC OK
41
+ [.] #<ZPNG::Chunk cHRM size= 32, crc=9cba513c > CRC OK
42
+ [.] #<ZPNG::Chunk pHYs size= 9, crc=46c96b3e > CRC OK
43
+ [.] #<ZPNG::Chunk IDAT size= 213, crc=5f3f1ff9 > CRC OK
44
+ [.] #<ZPNG::Chunk tEXt size= 37, crc=8d62fd1a > CRC OK
45
+ [.] #<ZPNG::Chunk tEXt size= 37, crc=fc3f45a6 > CRC OK
46
+ [.] #<ZPNG::Chunk IEND size= 0, crc=ae426082 > CRC OK
47
+
48
+ ### ASCII
49
+
50
+ # zpng --ascii qr_rgb.png
51
+
52
+
53
+ ####### ## ## # ## #######
54
+ # # ## # ## # #
55
+ # ### # # ##### # # ## # ### #
56
+ # ### # ## # # #### ## # ### #
57
+ # ### # #### # # #### # ### #
58
+ # # # # # ##### # #
59
+ ####### # # # # # # # # # #######
60
+ # # ## ## ##
61
+ #### # # ## # ## ## ### #
62
+ # ## ## ## # ## # ### ##
63
+ # ### ## ## # ## ## # ### #
64
+ ### # ##### # # ## # #
65
+ ## ## # # # # #### ## ##
66
+ # # ## ## # # ### ## ##
67
+ # ###### ## # # ##### #######
68
+ # #### ### ## # ## # ## #
69
+ ## ## ### ## # ## ########
70
+ # ### ## ## ######### #
71
+ #### ##### ## ## # # # #
72
+ ## # # # # ##### # # ## #
73
+ ###### ##### # # ## #
74
+ ### # #### # ### # ###
75
+ ### #### #### # # ####### ##
76
+ # # ## ## # ## # ## ###### #
77
+ # ####### # ## ## ##### #
78
+ # ### # ## ## # #
79
+ ####### # # ## ### # #
80
+ # # ### # # ###### ### #
81
+ # ### # # #### # ########
82
+ # ### # ### # #### # # #
83
+ # ### # ### ##### # ## # #
84
+ # # #### ## ## ### #
85
+ ####### # # ## # ## # ## #
86
+
87
+ ### Scanlines
88
+
89
+ # zpng --scanlines qr_rgb.png
90
+
91
+ [#<ZPNG::ScanLine idx=0, bpp=24, BPP=3, offset=1, filter=1>,
92
+ #<ZPNG::ScanLine idx=1, bpp=24, BPP=3, offset=107, filter=4>,
93
+ #<ZPNG::ScanLine idx=2, bpp=24, BPP=3, offset=213, filter=4>,
94
+ #<ZPNG::ScanLine idx=3, bpp=24, BPP=3, offset=319, filter=4>,
95
+ #<ZPNG::ScanLine idx=4, bpp=24, BPP=3, offset=425, filter=2>,
96
+ #<ZPNG::ScanLine idx=5, bpp=24, BPP=3, offset=531, filter=2>,
97
+ #<ZPNG::ScanLine idx=6, bpp=24, BPP=3, offset=637, filter=4>,
98
+ #<ZPNG::ScanLine idx=7, bpp=24, BPP=3, offset=743, filter=0>,
99
+ #<ZPNG::ScanLine idx=8, bpp=24, BPP=3, offset=849, filter=1>,
100
+ #<ZPNG::ScanLine idx=9, bpp=24, BPP=3, offset=955, filter=0>,
101
+ #<ZPNG::ScanLine idx=10, bpp=24, BPP=3, offset=1061, filter=0>,
102
+ #<ZPNG::ScanLine idx=11, bpp=24, BPP=3, offset=1167, filter=0>,
103
+ #<ZPNG::ScanLine idx=12, bpp=24, BPP=3, offset=1273, filter=1>,
104
+ #<ZPNG::ScanLine idx=13, bpp=24, BPP=3, offset=1379, filter=2>,
105
+ #<ZPNG::ScanLine idx=14, bpp=24, BPP=3, offset=1485, filter=4>,
106
+ #<ZPNG::ScanLine idx=15, bpp=24, BPP=3, offset=1591, filter=0>,
107
+ #<ZPNG::ScanLine idx=16, bpp=24, BPP=3, offset=1697, filter=4>,
108
+ #<ZPNG::ScanLine idx=17, bpp=24, BPP=3, offset=1803, filter=0>,
109
+ #<ZPNG::ScanLine idx=18, bpp=24, BPP=3, offset=1909, filter=4>,
110
+ #<ZPNG::ScanLine idx=19, bpp=24, BPP=3, offset=2015, filter=4>,
111
+ #<ZPNG::ScanLine idx=20, bpp=24, BPP=3, offset=2121, filter=0>,
112
+ #<ZPNG::ScanLine idx=21, bpp=24, BPP=3, offset=2227, filter=1>,
113
+ #<ZPNG::ScanLine idx=22, bpp=24, BPP=3, offset=2333, filter=2>,
114
+ #<ZPNG::ScanLine idx=23, bpp=24, BPP=3, offset=2439, filter=0>,
115
+ #<ZPNG::ScanLine idx=24, bpp=24, BPP=3, offset=2545, filter=2>,
116
+ #<ZPNG::ScanLine idx=25, bpp=24, BPP=3, offset=2651, filter=1>,
117
+ #<ZPNG::ScanLine idx=26, bpp=24, BPP=3, offset=2757, filter=1>,
118
+ #<ZPNG::ScanLine idx=27, bpp=24, BPP=3, offset=2863, filter=4>,
119
+ #<ZPNG::ScanLine idx=28, bpp=24, BPP=3, offset=2969, filter=4>,
120
+ #<ZPNG::ScanLine idx=29, bpp=24, BPP=3, offset=3075, filter=4>,
121
+ #<ZPNG::ScanLine idx=30, bpp=24, BPP=3, offset=3181, filter=4>,
122
+ #<ZPNG::ScanLine idx=31, bpp=24, BPP=3, offset=3287, filter=2>,
123
+ #<ZPNG::ScanLine idx=32, bpp=24, BPP=3, offset=3393, filter=4>,
124
+ #<ZPNG::ScanLine idx=33, bpp=24, BPP=3, offset=3499, filter=4>,
125
+ #<ZPNG::ScanLine idx=34, bpp=24, BPP=3, offset=3605, filter=1>]
126
+
127
+ ### Palette
128
+
129
+ # zpng --palette qr_plte_bw.png
130
+
131
+ #<ZPNG::Chunk PLTE size= 6, crc=55c2d37e >
132
+ 00000000 ff ff ff 00 00 00 |......|
133
+
134
+
135
+ ## Image manipulation
136
+
137
+ #!/usr/bin/env ruby
138
+ require 'zpng'
139
+ include ZPNG
140
+
141
+ img = Image.new(File.join(File.dirname(__FILE__),"http.png"))
142
+
143
+ puts "[.] original:"
144
+ puts img.to_s
145
+ puts
146
+
147
+ img.width.times do |x|
148
+ img[x,0] = (x % 2 == 0) ? Color::WHITE : Color::BLACK
149
+ end
150
+
151
+ puts "[.] modified:"
152
+ puts img.to_s
153
+
154
+ File.open("http-modified.png","wb") do |f|
155
+ f << img.export
156
+ end
157
+
158
+
159
+ License
160
+ -------
161
+ Released under the MIT License. See the [LICENSE](https://github.com/zed-0xff/zpng/blob/master/LICENSE.txt) file for further details.
@@ -0,0 +1,65 @@
1
+ zpng
2
+ ======
3
+
4
+
5
+ Description
6
+ -----------
7
+ A pure ruby PNG file manipulation & validation
8
+
9
+ Installation
10
+ ------------
11
+ gem install zpng
12
+
13
+ Usage
14
+ -----
15
+
16
+ % zpng -h
17
+
18
+ ### Info
19
+
20
+ % zpng --info qr_rgb.png
21
+
22
+ ### Chunks
23
+
24
+ % zpng --chunks qr_aux_chunks.png
25
+
26
+ ### ASCII
27
+
28
+ % zpng --ascii qr_rgb.png
29
+
30
+ ### Scanlines
31
+
32
+ % zpng --scanlines qr_rgb.png
33
+
34
+ ### Palette
35
+
36
+ % zpng --palette qr_plte_bw.png
37
+
38
+
39
+ ## Image manipulation
40
+
41
+ #!/usr/bin/env ruby
42
+ require 'zpng'
43
+ include ZPNG
44
+
45
+ img = Image.new(File.join(File.dirname(__FILE__),"http.png"))
46
+
47
+ puts "[.] original:"
48
+ puts img.to_s
49
+ puts
50
+
51
+ img.width.times do |x|
52
+ img[x,0] = (x % 2 == 0) ? Color::WHITE : Color::BLACK
53
+ end
54
+
55
+ puts "[.] modified:"
56
+ puts img.to_s
57
+
58
+ File.open("http-modified.png","wb") do |f|
59
+ f << img.export
60
+ end
61
+
62
+
63
+ License
64
+ -------
65
+ Released under the MIT License. See the [LICENSE](https://github.com/zed-0xff/zpng/blob/master/LICENSE.txt) file for further details.
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "zpng"
18
+ gem.homepage = "http://github.com/zed-0xff/zpng"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{pure ruby PNG file manipulation & validation}
21
+ #gem.description = %Q{TODO: longer description of your gem}
22
+ gem.email = "zed.0xff@gmail.com"
23
+ gem.authors = ["Andrey \"Zed\" Zaikin"]
24
+ gem.executables = %w'zpng'
25
+ gem.files.include "lib/**/*.rb"
26
+ # dependencies defined in Gemfile
27
+ end
28
+ Jeweler::RubygemsDotOrgTasks.new
29
+
30
+ require 'rspec/core'
31
+ require 'rspec/core/rake_task'
32
+ RSpec::Core::RakeTask.new(:spec) do |spec|
33
+ spec.pattern = FileList['spec/**/*_spec.rb']
34
+ end
35
+
36
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
37
+ spec.pattern = 'spec/**/*_spec.rb'
38
+ spec.rcov = true
39
+ end
40
+
41
+ task :default => :spec
42
+
43
+ #require 'rake/rdoctask'
44
+ #Rake::RDocTask.new do |rdoc|
45
+ # version = File.exist?('VERSION') ? File.read('VERSION') : ""
46
+ #
47
+ # rdoc.rdoc_dir = 'rdoc'
48
+ # rdoc.title = "zpng #{version}"
49
+ # rdoc.rdoc_files.include('README*')
50
+ # rdoc.rdoc_files.include('lib/**/*.rb')
51
+ #end
52
+
53
+ desc "build readme"
54
+ task :readme do
55
+ require 'erb'
56
+ tpl = File.read('README.md.tpl').gsub(/^%\s+(.+)/) do |x|
57
+ x.sub! /^%/,''
58
+ "<%= run(\"#{x}\") %>"
59
+ end
60
+ def run cmd
61
+ cmd.strip!
62
+ puts "[.] #{cmd} ..."
63
+ r = " # #{cmd}\n\n"
64
+ cmd.sub! /^zpng/,"../bin/zpng"
65
+ lines = `#{cmd}`.sub(/\A\n+/m,'').sub(/\s+\Z/,'').split("\n")
66
+ lines = lines[0,25] + ['...'] if lines.size > 50
67
+ r << lines.map{|x| " #{x}"}.join("\n")
68
+ r << "\n"
69
+ end
70
+ Dir.chdir 'samples'
71
+ result = ERB.new(tpl,nil,'%>').result
72
+ Dir.chdir '..'
73
+ File.open('README.md','w'){ |f| f << result }
74
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
4
+ require 'zpng'
5
+ require 'zpng/cli'
6
+
7
+ ZPNG::CLI.new.run
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env ruby
2
+ require 'zlib'
3
+ require 'stringio'
4
+ require 'colorize'
5
+
6
+ require 'zpng/color'
7
+ require 'zpng/block'
8
+ require 'zpng/scan_line'
9
+ require 'zpng/chunk'
10
+ require 'zpng/image'
11
+
12
+ # see alse http://github.com/wvanbergen/chunky_png/
13
+
14
+ if $0 == __FILE__
15
+ if ARGV.size == 0
16
+ puts "gimme a png filename!"
17
+ else
18
+ img = ZPNG::Image.new(ARGV[0])
19
+ img.dump
20
+ puts "[.] image size #{img.width}x#{img.height}"
21
+ puts "[.] uncompressed imagedata size=#{img.imagedata.size}"
22
+ puts "[.] palette =#{img.palette}"
23
+ # puts "[.] imagedata: #{img.imagedata[0..30].split('').map{|x| sprintf("%02X",x.ord)}.join(' ')}"
24
+
25
+ require 'hexdump'
26
+ #Hexdump.dump(img.imagedata, :width => 6)
27
+ require 'pp'
28
+ pp img.scanlines[0..5]
29
+ # puts Hexdump.dump(img.imagedata[0,60])
30
+ # img.scanlines.each do |l|
31
+ # puts l.to_s
32
+ # end
33
+ puts img.to_s
34
+ img[1,0]= ZPNG::Color.new(0,0,0)
35
+ puts img.to_s
36
+ File.open 'export.png','wb' do |f|
37
+ f << img.export
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,41 @@
1
+ module ZPNG
2
+ class Block
3
+ attr_accessor :width, :height, :pixels
4
+ def initialize image, x, y, w, h
5
+ @width, @height = w,h
6
+ @pixels = []
7
+ h.times do |i|
8
+ w.times do |j|
9
+ @pixels << image[x+j,y+i]
10
+ end
11
+ end
12
+ end
13
+
14
+ def to_s
15
+ a = []
16
+ height.times do |i|
17
+ b = []
18
+ width.times do |j|
19
+ b << pixels[i*width+j].to_s
20
+ end
21
+ a << b.join(" ")
22
+ end
23
+ a.join "\n"
24
+ end
25
+
26
+ def to_binary_string c_white = ' ', c_black = 'X'
27
+ @pixels.each do |p|
28
+ raise "pixel #{p.inspect} is not white nor black" if !p.white? && !p.black?
29
+ end
30
+ a = []
31
+ height.times do |i|
32
+ b = []
33
+ width.times do |j|
34
+ b << (pixels[i*width+j].black? ? c_black : c_white)
35
+ end
36
+ a << b.join(" ")
37
+ end
38
+ a.join "\n"
39
+ end
40
+ end
41
+ end