image_util 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/AGENTS.md +5 -6
- data/CHANGELOG.md +41 -6
- data/README.md +229 -81
- data/Rakefile +5 -0
- data/docs/cli.md +5 -0
- data/docs/samples/background.png +0 -0
- data/docs/samples/bitmap_text.png +0 -0
- data/docs/samples/colors.png +0 -0
- data/docs/samples/constructor.png +0 -0
- data/docs/samples/dither.png +0 -0
- data/docs/samples/draw.png +0 -0
- data/docs/samples/iterator.png +0 -0
- data/docs/samples/paste.png +0 -0
- data/docs/samples/pdither.png +0 -0
- data/docs/samples/pipe.png +0 -0
- data/docs/samples/range.png +0 -0
- data/docs/samples/redimension.png +0 -0
- data/docs/samples/resize.png +0 -0
- data/docs/samples/sixel.png +0 -0
- data/docs/samples/transform.png +0 -0
- data/exe/image_util +7 -0
- data/lib/image_util/benchmarking.rb +25 -0
- data/lib/image_util/bitmap_font/fonts/smfont/charset.txt +1 -0
- data/lib/image_util/bitmap_font/fonts/smfont/font.png +0 -0
- data/lib/image_util/bitmap_font.rb +72 -0
- data/lib/image_util/cli.rb +54 -0
- data/lib/image_util/codec/chunky_png.rb +67 -0
- data/lib/image_util/codec/image_magick.rb +82 -15
- data/lib/image_util/codec/kitty.rb +81 -0
- data/lib/image_util/codec/libpng.rb +2 -10
- data/lib/image_util/codec/libsixel.rb +14 -14
- data/lib/image_util/codec/libturbojpeg.rb +1 -11
- data/lib/image_util/codec/pam.rb +24 -22
- data/lib/image_util/codec/ruby_sixel.rb +12 -13
- data/lib/image_util/codec.rb +5 -1
- data/lib/image_util/color/css_colors.rb +158 -0
- data/lib/image_util/color.rb +67 -14
- data/lib/image_util/extension.rb +24 -0
- data/lib/image_util/filter/_mixin.rb +9 -0
- data/lib/image_util/filter/background.rb +4 -4
- data/lib/image_util/filter/bitmap_text.rb +17 -0
- data/lib/image_util/filter/colors.rb +21 -0
- data/lib/image_util/filter/draw.rb +22 -9
- data/lib/image_util/filter/palette.rb +197 -0
- data/lib/image_util/filter/paste.rb +1 -1
- data/lib/image_util/filter/redimension.rb +83 -0
- data/lib/image_util/filter/resize.rb +1 -1
- data/lib/image_util/filter/transform.rb +48 -0
- data/lib/image_util/filter.rb +5 -1
- data/lib/image_util/generator/bitmap_text.rb +38 -0
- data/lib/image_util/generator/example/rose.png +0 -0
- data/lib/image_util/generator/example.rb +9 -0
- data/lib/image_util/generator.rb +8 -0
- data/lib/image_util/image/buffer.rb +11 -11
- data/lib/image_util/image.rb +54 -26
- data/lib/image_util/magic.rb +8 -6
- data/lib/image_util/statistic/{color.rb → colors.rb} +2 -2
- data/lib/image_util/statistic.rb +1 -1
- data/lib/image_util/terminal.rb +61 -0
- data/lib/image_util/version.rb +1 -1
- data/lib/image_util/view/interpolated.rb +1 -1
- data/lib/image_util.rb +6 -0
- metadata +82 -4
- data/lib/image_util/filter/dither.rb +0 -96
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: image_util
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hmdne
|
@@ -9,6 +9,20 @@ bindir: exe
|
|
9
9
|
cert_chain: []
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: base64
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
12
26
|
- !ruby/object:Gem::Dependency
|
13
27
|
name: ffi
|
14
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -23,11 +37,40 @@ dependencies:
|
|
23
37
|
- - "~>"
|
24
38
|
- !ruby/object:Gem::Version
|
25
39
|
version: '1.16'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: io-console
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.5'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.5'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: thor
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.2'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '1.2'
|
26
68
|
description: Lightweight Color and Image classes for manipulating pixels. Provides
|
27
69
|
SIXEL output plus FFI bindings for libpng, libturbojpeg and libsixel.
|
28
70
|
email:
|
29
71
|
- 54514036+hmdne@users.noreply.github.com
|
30
|
-
executables:
|
72
|
+
executables:
|
73
|
+
- image_util
|
31
74
|
extensions: []
|
32
75
|
extra_rdoc_files: []
|
33
76
|
files:
|
@@ -38,28 +81,63 @@ files:
|
|
38
81
|
- LICENSE.txt
|
39
82
|
- README.md
|
40
83
|
- Rakefile
|
84
|
+
- docs/cli.md
|
85
|
+
- docs/samples/background.png
|
86
|
+
- docs/samples/bitmap_text.png
|
87
|
+
- docs/samples/colors.png
|
88
|
+
- docs/samples/constructor.png
|
89
|
+
- docs/samples/dither.png
|
90
|
+
- docs/samples/draw.png
|
91
|
+
- docs/samples/iterator.png
|
92
|
+
- docs/samples/paste.png
|
93
|
+
- docs/samples/pdither.png
|
94
|
+
- docs/samples/pipe.png
|
95
|
+
- docs/samples/range.png
|
96
|
+
- docs/samples/redimension.png
|
97
|
+
- docs/samples/resize.png
|
98
|
+
- docs/samples/sixel.png
|
99
|
+
- docs/samples/transform.png
|
100
|
+
- exe/image_util
|
41
101
|
- lib/image_util.rb
|
102
|
+
- lib/image_util/benchmarking.rb
|
103
|
+
- lib/image_util/bitmap_font.rb
|
104
|
+
- lib/image_util/bitmap_font/fonts/smfont/charset.txt
|
105
|
+
- lib/image_util/bitmap_font/fonts/smfont/font.png
|
106
|
+
- lib/image_util/cli.rb
|
42
107
|
- lib/image_util/codec.rb
|
43
108
|
- lib/image_util/codec/_guard.rb
|
109
|
+
- lib/image_util/codec/chunky_png.rb
|
44
110
|
- lib/image_util/codec/image_magick.rb
|
111
|
+
- lib/image_util/codec/kitty.rb
|
45
112
|
- lib/image_util/codec/libpng.rb
|
46
113
|
- lib/image_util/codec/libsixel.rb
|
47
114
|
- lib/image_util/codec/libturbojpeg.rb
|
48
115
|
- lib/image_util/codec/pam.rb
|
49
116
|
- lib/image_util/codec/ruby_sixel.rb
|
50
117
|
- lib/image_util/color.rb
|
118
|
+
- lib/image_util/color/css_colors.rb
|
119
|
+
- lib/image_util/extension.rb
|
51
120
|
- lib/image_util/filter.rb
|
52
121
|
- lib/image_util/filter/_mixin.rb
|
53
122
|
- lib/image_util/filter/background.rb
|
54
|
-
- lib/image_util/filter/
|
123
|
+
- lib/image_util/filter/bitmap_text.rb
|
124
|
+
- lib/image_util/filter/colors.rb
|
55
125
|
- lib/image_util/filter/draw.rb
|
126
|
+
- lib/image_util/filter/palette.rb
|
56
127
|
- lib/image_util/filter/paste.rb
|
128
|
+
- lib/image_util/filter/redimension.rb
|
57
129
|
- lib/image_util/filter/resize.rb
|
130
|
+
- lib/image_util/filter/transform.rb
|
131
|
+
- lib/image_util/generator.rb
|
132
|
+
- lib/image_util/generator/bitmap_text.rb
|
133
|
+
- lib/image_util/generator/example.rb
|
134
|
+
- lib/image_util/generator/example/rose.png
|
58
135
|
- lib/image_util/image.rb
|
59
136
|
- lib/image_util/image/buffer.rb
|
60
137
|
- lib/image_util/magic.rb
|
61
138
|
- lib/image_util/statistic.rb
|
62
|
-
- lib/image_util/statistic/
|
139
|
+
- lib/image_util/statistic/colors.rb
|
140
|
+
- lib/image_util/terminal.rb
|
63
141
|
- lib/image_util/util.rb
|
64
142
|
- lib/image_util/version.rb
|
65
143
|
- lib/image_util/view.rb
|
@@ -1,96 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ImageUtil
|
4
|
-
module Filter
|
5
|
-
module Dither
|
6
|
-
extend ImageUtil::Filter::Mixin
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
def dither_distance_sq(c1, c2)
|
11
|
-
len = [c1.length, c2.length].max
|
12
|
-
|
13
|
-
case len
|
14
|
-
when 1
|
15
|
-
d = (c1[0] || 255) - (c2[0] || 255)
|
16
|
-
d * d
|
17
|
-
when 2
|
18
|
-
d0 = (c1[0] || 255) - (c2[0] || 255)
|
19
|
-
d1 = (c1[1] || 255) - (c2[1] || 255)
|
20
|
-
d0 * d0 + d1 * d1
|
21
|
-
when 3
|
22
|
-
d0 = (c1[0] || 255) - (c2[0] || 255)
|
23
|
-
d1 = (c1[1] || 255) - (c2[1] || 255)
|
24
|
-
d2 = (c1[2] || 255) - (c2[2] || 255)
|
25
|
-
d0 * d0 + d1 * d1 + d2 * d2
|
26
|
-
when 4
|
27
|
-
d0 = (c1[0] || 255) - (c2[0] || 255)
|
28
|
-
d1 = (c1[1] || 255) - (c2[1] || 255)
|
29
|
-
d2 = (c1[2] || 255) - (c2[2] || 255)
|
30
|
-
d3 = (c1[3] || 255) - (c2[3] || 255)
|
31
|
-
d0 * d0 + d1 * d1 + d2 * d2 + d3 * d3
|
32
|
-
else
|
33
|
-
sum = 0
|
34
|
-
len.times do |i|
|
35
|
-
d = (c1[i] || 255) - (c2[i] || 255)
|
36
|
-
sum += d * d
|
37
|
-
end
|
38
|
-
sum
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
public
|
43
|
-
|
44
|
-
def dither!(count)
|
45
|
-
palette = histogram.sort_by { |_, v| -v - rand }.first(count).map(&:first)
|
46
|
-
|
47
|
-
cache = {}
|
48
|
-
|
49
|
-
nearest = lambda do |color|
|
50
|
-
key = (color[0] || 255) |
|
51
|
-
((color[1] || 255) << 8) |
|
52
|
-
((color[2] || 255) << 16) |
|
53
|
-
((color[3] || 255) << 24)
|
54
|
-
cache[key] ||= begin
|
55
|
-
best = palette.first
|
56
|
-
best_dist = dither_distance_sq(color, best)
|
57
|
-
idx = 1
|
58
|
-
while idx < palette.length
|
59
|
-
c = palette[idx]
|
60
|
-
dist = dither_distance_sq(color, c)
|
61
|
-
if dist < best_dist
|
62
|
-
best = c
|
63
|
-
best_dist = dist
|
64
|
-
end
|
65
|
-
idx += 1
|
66
|
-
end
|
67
|
-
best
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
if dimensions.length == 2
|
72
|
-
w = width
|
73
|
-
h = height
|
74
|
-
buf = buffer
|
75
|
-
idx = 0
|
76
|
-
step = buf.pixel_bytes
|
77
|
-
h.times do
|
78
|
-
w.times do
|
79
|
-
color = buf.get_index(idx)
|
80
|
-
buf.set_index(idx, nearest.call(color))
|
81
|
-
idx += step
|
82
|
-
end
|
83
|
-
end
|
84
|
-
else
|
85
|
-
set_each_pixel_by_location do |loc|
|
86
|
-
color = self[*loc]
|
87
|
-
nearest.call(color)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
self
|
91
|
-
end
|
92
|
-
|
93
|
-
define_immutable_version :dither
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|