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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +5 -6
  3. data/CHANGELOG.md +41 -6
  4. data/README.md +229 -81
  5. data/Rakefile +5 -0
  6. data/docs/cli.md +5 -0
  7. data/docs/samples/background.png +0 -0
  8. data/docs/samples/bitmap_text.png +0 -0
  9. data/docs/samples/colors.png +0 -0
  10. data/docs/samples/constructor.png +0 -0
  11. data/docs/samples/dither.png +0 -0
  12. data/docs/samples/draw.png +0 -0
  13. data/docs/samples/iterator.png +0 -0
  14. data/docs/samples/paste.png +0 -0
  15. data/docs/samples/pdither.png +0 -0
  16. data/docs/samples/pipe.png +0 -0
  17. data/docs/samples/range.png +0 -0
  18. data/docs/samples/redimension.png +0 -0
  19. data/docs/samples/resize.png +0 -0
  20. data/docs/samples/sixel.png +0 -0
  21. data/docs/samples/transform.png +0 -0
  22. data/exe/image_util +7 -0
  23. data/lib/image_util/benchmarking.rb +25 -0
  24. data/lib/image_util/bitmap_font/fonts/smfont/charset.txt +1 -0
  25. data/lib/image_util/bitmap_font/fonts/smfont/font.png +0 -0
  26. data/lib/image_util/bitmap_font.rb +72 -0
  27. data/lib/image_util/cli.rb +54 -0
  28. data/lib/image_util/codec/chunky_png.rb +67 -0
  29. data/lib/image_util/codec/image_magick.rb +82 -15
  30. data/lib/image_util/codec/kitty.rb +81 -0
  31. data/lib/image_util/codec/libpng.rb +2 -10
  32. data/lib/image_util/codec/libsixel.rb +14 -14
  33. data/lib/image_util/codec/libturbojpeg.rb +1 -11
  34. data/lib/image_util/codec/pam.rb +24 -22
  35. data/lib/image_util/codec/ruby_sixel.rb +12 -13
  36. data/lib/image_util/codec.rb +5 -1
  37. data/lib/image_util/color/css_colors.rb +158 -0
  38. data/lib/image_util/color.rb +67 -14
  39. data/lib/image_util/extension.rb +24 -0
  40. data/lib/image_util/filter/_mixin.rb +9 -0
  41. data/lib/image_util/filter/background.rb +4 -4
  42. data/lib/image_util/filter/bitmap_text.rb +17 -0
  43. data/lib/image_util/filter/colors.rb +21 -0
  44. data/lib/image_util/filter/draw.rb +22 -9
  45. data/lib/image_util/filter/palette.rb +197 -0
  46. data/lib/image_util/filter/paste.rb +1 -1
  47. data/lib/image_util/filter/redimension.rb +83 -0
  48. data/lib/image_util/filter/resize.rb +1 -1
  49. data/lib/image_util/filter/transform.rb +48 -0
  50. data/lib/image_util/filter.rb +5 -1
  51. data/lib/image_util/generator/bitmap_text.rb +38 -0
  52. data/lib/image_util/generator/example/rose.png +0 -0
  53. data/lib/image_util/generator/example.rb +9 -0
  54. data/lib/image_util/generator.rb +8 -0
  55. data/lib/image_util/image/buffer.rb +11 -11
  56. data/lib/image_util/image.rb +54 -26
  57. data/lib/image_util/magic.rb +8 -6
  58. data/lib/image_util/statistic/{color.rb → colors.rb} +2 -2
  59. data/lib/image_util/statistic.rb +1 -1
  60. data/lib/image_util/terminal.rb +61 -0
  61. data/lib/image_util/version.rb +1 -1
  62. data/lib/image_util/view/interpolated.rb +1 -1
  63. data/lib/image_util.rb +6 -0
  64. metadata +82 -4
  65. 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.1.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/dither.rb
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/color.rb
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