image_paradise 0.1.12

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.

Potentially problematic release.


This version of image_paradise might be problematic. Click here for more details.

Files changed (115) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +38 -0
  3. data/README.md +179 -0
  4. data/USAGE.md +10 -0
  5. data/bin/black_white +10 -0
  6. data/bin/display_text_from_this_image +7 -0
  7. data/bin/image_paradise +7 -0
  8. data/bin/image_paradise_shell +7 -0
  9. data/bin/image_to_ascii +54 -0
  10. data/bin/image_to_pdf +7 -0
  11. data/bin/make_this_image_transparent +7 -0
  12. data/bin/rotate_left +7 -0
  13. data/bin/rotate_right +7 -0
  14. data/doc/README.gen +162 -0
  15. data/doc/TODO_FOR_THE_GTK_GUI.md +1 -0
  16. data/image_paradise.gemspec +50 -0
  17. data/lib/image_paradise.rb +5 -0
  18. data/lib/image_paradise/base/base.rb +91 -0
  19. data/lib/image_paradise/black_white.rb +89 -0
  20. data/lib/image_paradise/confree_generator/class.rb +614 -0
  21. data/lib/image_paradise/confree_generator/constants.rb +61 -0
  22. data/lib/image_paradise/confree_generator/gui/gtk_confree_generator.rb +752 -0
  23. data/lib/image_paradise/confree_generator/gui/insert_button.rb +78 -0
  24. data/lib/image_paradise/confree_generator/reset.rb +61 -0
  25. data/lib/image_paradise/confree_generator/shared/shared.rb +100 -0
  26. data/lib/image_paradise/constants.rb +43 -0
  27. data/lib/image_paradise/constants/image_file_types.rb +21 -0
  28. data/lib/image_paradise/create_animated_gif.rb +47 -0
  29. data/lib/image_paradise/crop/crop.rb +302 -0
  30. data/lib/image_paradise/gm_support.rb +34 -0
  31. data/lib/image_paradise/graphs.rb +36 -0
  32. data/lib/image_paradise/graphs/accumulator_bar.rb +29 -0
  33. data/lib/image_paradise/graphs/area.rb +64 -0
  34. data/lib/image_paradise/graphs/bar.rb +117 -0
  35. data/lib/image_paradise/graphs/bar_conversion.rb +53 -0
  36. data/lib/image_paradise/graphs/base.rb +1392 -0
  37. data/lib/image_paradise/graphs/bezier.rb +45 -0
  38. data/lib/image_paradise/graphs/bullet.rb +115 -0
  39. data/lib/image_paradise/graphs/deprecated.rb +42 -0
  40. data/lib/image_paradise/graphs/dot.rb +129 -0
  41. data/lib/image_paradise/graphs/line.rb +328 -0
  42. data/lib/image_paradise/graphs/mini/bar.rb +42 -0
  43. data/lib/image_paradise/graphs/mini/legend.rb +109 -0
  44. data/lib/image_paradise/graphs/mini/pie.rb +42 -0
  45. data/lib/image_paradise/graphs/mini/side_bar.rb +41 -0
  46. data/lib/image_paradise/graphs/net.rb +133 -0
  47. data/lib/image_paradise/graphs/photo_bar.rb +106 -0
  48. data/lib/image_paradise/graphs/pie.rb +139 -0
  49. data/lib/image_paradise/graphs/scatter.rb +264 -0
  50. data/lib/image_paradise/graphs/scene.rb +216 -0
  51. data/lib/image_paradise/graphs/side_bar.rb +144 -0
  52. data/lib/image_paradise/graphs/side_stacked_bar.rb +116 -0
  53. data/lib/image_paradise/graphs/spider.rb +163 -0
  54. data/lib/image_paradise/graphs/stacked_area.rb +73 -0
  55. data/lib/image_paradise/graphs/stacked_bar.rb +68 -0
  56. data/lib/image_paradise/graphs/stacked_mixin.rb +30 -0
  57. data/lib/image_paradise/graphs/themes.rb +117 -0
  58. data/lib/image_paradise/graphviz/README.md +2 -0
  59. data/lib/image_paradise/graphviz/generate_graphviz_image.rb +274 -0
  60. data/lib/image_paradise/gui/gtk/control_panel.rb +126 -0
  61. data/lib/image_paradise/identify.rb +145 -0
  62. data/lib/image_paradise/image_border.rb +231 -0
  63. data/lib/image_paradise/image_manipulations.rb +320 -0
  64. data/lib/image_paradise/image_paradise.rb +150 -0
  65. data/lib/image_paradise/image_to_ascii/image_to_ascii.rb +187 -0
  66. data/lib/image_paradise/image_to_pdf/image_to_pdf.rb +99 -0
  67. data/lib/image_paradise/label/README.md +2 -0
  68. data/lib/image_paradise/label/simple_label.rb +206 -0
  69. data/lib/image_paradise/optimizer.rb +483 -0
  70. data/lib/image_paradise/project/project.rb +29 -0
  71. data/lib/image_paradise/random_text_to_image.rb +363 -0
  72. data/lib/image_paradise/requires/common_base_requires.rb +17 -0
  73. data/lib/image_paradise/requires/require_colours.rb +9 -0
  74. data/lib/image_paradise/requires/require_gtk_components.rb +8 -0
  75. data/lib/image_paradise/requires/require_image_to_ascii.rb +7 -0
  76. data/lib/image_paradise/requires/require_the_image_paradise_project.rb +24 -0
  77. data/lib/image_paradise/requires/require_toplevel_methods.rb +21 -0
  78. data/lib/image_paradise/rotate/README.md +2 -0
  79. data/lib/image_paradise/rotate/rotate.rb +98 -0
  80. data/lib/image_paradise/shell/interactive.rb +156 -0
  81. data/lib/image_paradise/svg/README.md +5 -0
  82. data/lib/image_paradise/svg/circle.rb +106 -0
  83. data/lib/image_paradise/svg/feature.rb +48 -0
  84. data/lib/image_paradise/svg/rectangle.rb +154 -0
  85. data/lib/image_paradise/svg/svg.rb +102 -0
  86. data/lib/image_paradise/to_gif.rb +91 -0
  87. data/lib/image_paradise/to_jpg.rb +90 -0
  88. data/lib/image_paradise/toplevel_methods/add_black_border_to_this_image.rb +56 -0
  89. data/lib/image_paradise/toplevel_methods/crop.rb +28 -0
  90. data/lib/image_paradise/toplevel_methods/e.rb +16 -0
  91. data/lib/image_paradise/toplevel_methods/esystem.rb +19 -0
  92. data/lib/image_paradise/toplevel_methods/extract_text_from_this_image.rb +56 -0
  93. data/lib/image_paradise/toplevel_methods/file_related_code.rb +25 -0
  94. data/lib/image_paradise/toplevel_methods/flip_image_left_right.rb +32 -0
  95. data/lib/image_paradise/toplevel_methods/greyscale_this_image.rb +59 -0
  96. data/lib/image_paradise/toplevel_methods/help.rb +30 -0
  97. data/lib/image_paradise/toplevel_methods/make_this_image_transparent.rb +30 -0
  98. data/lib/image_paradise/toplevel_methods/menu.rb +92 -0
  99. data/lib/image_paradise/toplevel_methods/merge_these_images.rb +49 -0
  100. data/lib/image_paradise/toplevel_methods/mirror_image.rb +28 -0
  101. data/lib/image_paradise/toplevel_methods/misc.rb +31 -0
  102. data/lib/image_paradise/toplevel_methods/png_to_svg.rb +34 -0
  103. data/lib/image_paradise/toplevel_methods/roebe.rb +17 -0
  104. data/lib/image_paradise/toplevel_methods/to_png.rb +105 -0
  105. data/lib/image_paradise/toplevel_methods/wallpaper.rb +37 -0
  106. data/lib/image_paradise/toplevel_methods/write_this_text.rb +76 -0
  107. data/lib/image_paradise/version/version.rb +19 -0
  108. data/test/16x16_red_square_image_for_testing.png +0 -0
  109. data/test/testing_confree_generator.rb +8 -0
  110. data/test/testing_crop.rb +19 -0
  111. data/test/testing_image_magick_commands.rb +39 -0
  112. data/test/testing_image_paradise.rb +49 -0
  113. data/test/testing_the_svg_component.html +261 -0
  114. data/test/testing_the_svg_component.rb +106 -0
  115. metadata +217 -0
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module ImageParadise
6
+
7
+ class ImageToAscii # === ImageParadise::ImageToAscii
8
+
9
+ require 'uri'
10
+ require 'open-uri'
11
+
12
+ begin
13
+ require 'rmagick' unless Object.const_defined? :Magick
14
+ rescue LoadError; end
15
+
16
+ # ========================================================================= #
17
+ # === HTML
18
+ # ========================================================================= #
19
+ HTML = 'html'
20
+
21
+ # ========================================================================= #
22
+ # === BR
23
+ # ========================================================================= #
24
+ BR = '<br/>'
25
+
26
+ attr_writer :image_chars
27
+
28
+ # ========================================================================= #
29
+ # === initialize
30
+ # ========================================================================= #
31
+ def initialize(
32
+ path_to_file,
33
+ run_already = true
34
+ )
35
+ reset
36
+ # open-uri open will fallback to IO open.
37
+ path_to_file = [path_to_file] if path_to_file.is_a? String
38
+ if path_to_file
39
+ path_to_file.each {|path|
40
+ open(path) { |file| @data = file.read }
41
+ }
42
+ end
43
+ self
44
+ end
45
+
46
+ # ========================================================================= #
47
+ # === result?
48
+ # ========================================================================= #
49
+ def result?
50
+ @result
51
+ end; alias result result? # === result
52
+
53
+ # ========================================================================= #
54
+ # === ImageToAscii[]
55
+ #
56
+ # Usage example:
57
+ #
58
+ # require 'image_to_ascii'
59
+ # ImageToAscii['screenshot_2014.png']
60
+ #
61
+ # ========================================================================= #
62
+ def self.[](i)
63
+ _ = ImageToAscii.new(i)
64
+ _.to_ascii
65
+ end
66
+
67
+ # ========================================================================= #
68
+ # === reset
69
+ # ========================================================================= #
70
+ def reset
71
+ @data = nil
72
+ end
73
+
74
+ # ========================================================================= #
75
+ # === to_ascii
76
+ # ========================================================================= #
77
+ def to_ascii(options = {})
78
+ options = {
79
+ width: 100, color: false, format: 'text'
80
+ }.merge(options)
81
+
82
+ img = Magick::Image.from_blob(@data).first
83
+
84
+ width = options[:width]
85
+ scale = (width.to_f / img.columns)
86
+ height = ((img.rows * scale) / 2).to_i
87
+
88
+ img.resize!(width, height)
89
+ # ======================================================================= #
90
+ # Check whether we wish to add colours.
91
+ # ======================================================================= #
92
+ color_image = img.dup if options[:color]
93
+ img = img.quantize(
94
+ image_chars.length, Magick::GRAYColorspace
95
+ ).normalize
96
+ quantum_calc = Magick::QuantumRange / Magick::QuantumPixel.to_i
97
+ image_chars.map! {|char|
98
+ char == ' ' ? '&nbsp;' : char
99
+ } if options[:format] == HTML
100
+
101
+ border = "+#{'-' * width}+#{line_break(options[:format])}"
102
+ border = html_char(border) if options[:format] == HTML
103
+
104
+ output = border.dup
105
+
106
+ img.view(0, 0, width, height) { |view|
107
+ height.times { |i|
108
+ output << '|'
109
+ width.times { |j|
110
+ character = image_chars[view[i][j].red/quantum_calc]
111
+ if options[:format] == HTML
112
+ if options[:color]
113
+ pix = color_image.pixel_color(j,i)
114
+ color_string = "color: #{pix.to_color( Magick::AllCompliance,false,8, true)};"
115
+ else
116
+ color_string = ''
117
+ end
118
+ character = html_char(character, color_string)
119
+ else
120
+ # text-format
121
+ if options[:color]
122
+ pix = color_image.pixel_color(j,i)
123
+ character = character.color(
124
+ unified_rgb_value(pix.red),
125
+ unified_rgb_value(pix.green),
126
+ unified_rgb_value(pix.blue)
127
+ )
128
+ end
129
+ end
130
+ output << character
131
+ }
132
+ output << "|#{line_break(options[:format])}"
133
+ }
134
+ }
135
+ @result = output + border
136
+ return @result
137
+ end
138
+
139
+ # ========================================================================= #
140
+ # === image_chars
141
+ # ========================================================================= #
142
+ def image_chars
143
+ @image_chars ||= ' .~:+=o*x^%#@$MW'.chars.to_a
144
+ end
145
+
146
+ # ========================================================================= #
147
+ # === inspect
148
+ # ========================================================================= #
149
+ def inspect
150
+ "#<#{self.class.to_s}>"
151
+ end
152
+
153
+ # ========================================================================= #
154
+ # === line_break
155
+ # ========================================================================= #
156
+ def line_break(format)
157
+ (format == 'text') ? "\n" : BR
158
+ end; private :line_break
159
+
160
+ # ========================================================================= #
161
+ # === unified_rgb_value
162
+ # ========================================================================= #
163
+ def unified_rgb_value(number)
164
+ (Magick::QuantumDepth == 16) ? (number / 256) : number
165
+ end; private :unified_rgb_value
166
+
167
+ # ========================================================================= #
168
+ # === html_char
169
+ # ========================================================================= #
170
+ def html_char(char, additional_style = '')
171
+ "<span style=\"font-family: 'Lucida Console', Monaco, monospace; #{additional_style}\">#{char}</span>"
172
+ end; private :html_char
173
+
174
+ end
175
+
176
+ # =========================================================================== #
177
+ # === ImageParadise.image_to_ascii
178
+ # =========================================================================== #
179
+ def self.image_to_ascii(i = ARGV)
180
+ ImageParadise::ImageToAscii.new(i)
181
+ end
182
+
183
+ end
184
+
185
+ if __FILE__ == $PROGRAM_NAME
186
+ ImageParadise::ImageToAscii.new(ARGV)
187
+ end
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::ImageToPdf
6
+ #
7
+ # This class will simply convert an image-file into a .pdf "file".
8
+ #
9
+ # Usage example:
10
+ #
11
+ # ImageParadise::ImageToPdf.new(ARGV)
12
+ #
13
+ # =========================================================================== #
14
+ # require 'image_paradise/image_to_pdf/image_to_pdf.rb'
15
+ # =========================================================================== #
16
+ require 'image_paradise/base/base.rb'
17
+
18
+ module ImageParadise
19
+
20
+ class ImageToPdf < Base # === ImageParadise::ImageToPdf
21
+
22
+ # ========================================================================= #
23
+ # === initialize
24
+ # ========================================================================= #
25
+ def initialize(
26
+ commandline_arguments = nil,
27
+ run_already = true
28
+ )
29
+ reset
30
+ set_commandline_arguments(
31
+ commandline_arguments
32
+ )
33
+ run if run_already
34
+ end
35
+
36
+ # ========================================================================= #
37
+ # === reset (reset tag)
38
+ # ========================================================================= #
39
+ def reset
40
+ super()
41
+ end
42
+
43
+ # ========================================================================= #
44
+ # === set_commandline_arguments
45
+ # ========================================================================= #
46
+ def set_commandline_arguments(i = '')
47
+ i = [i].flatten.compact
48
+ @commandline_arguments = i
49
+ end
50
+
51
+ # ========================================================================= #
52
+ # === first_argument?
53
+ # ========================================================================= #
54
+ def first_argument?
55
+ @commandline_arguments.first
56
+ end; alias first? first_argument? # === first?
57
+ alias input? first_argument? # === input?
58
+
59
+ # ========================================================================= #
60
+ # === output?
61
+ # ========================================================================= #
62
+ def output?
63
+ input?.gsub(/#{extname?}/,'')+'.pdf'
64
+ end
65
+
66
+ # ========================================================================= #
67
+ # === commandline_arguments?
68
+ # ========================================================================= #
69
+ def commandline_arguments?
70
+ @commandline_arguments
71
+ end
72
+
73
+ # ========================================================================= #
74
+ # === extname?
75
+ # ========================================================================= #
76
+ def extname?
77
+ File.extname(input?)
78
+ end
79
+
80
+ # ========================================================================= #
81
+ # === run (run tag)
82
+ # ========================================================================= #
83
+ def run
84
+ _ = "convert #{input?} #{output?}"
85
+ esystem _
86
+ end
87
+
88
+ # ========================================================================= #
89
+ # === ImageParadise::ImageToPdf[]
90
+ # ========================================================================= #
91
+ def self.[](i = '')
92
+ new(i)
93
+ end
94
+
95
+ end; end
96
+
97
+ if __FILE__ == $PROGRAM_NAME
98
+ ImageParadise::ImageToPdf.new(ARGV)
99
+ end # image_to_pdf
@@ -0,0 +1,2 @@
1
+ This directory will have label-specific code. This allows you
2
+ to automatically create certain text in imagemagic.
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::SimpleLabel
6
+ #
7
+ # This class will create a simple label.
8
+ # =========================================================================== #
9
+ require 'image_paradise/base/base.rb'
10
+
11
+ module ImageParadise
12
+
13
+ class SimpleLabel < Base # === ImageParadise::SimpleLabel
14
+
15
+ begin
16
+ require 'open_in_browser'
17
+ rescue LoadError; end
18
+
19
+ # ========================================================================= #
20
+ # === DO_OPEN_IN_BROWSER
21
+ # ========================================================================= #
22
+ DO_OPEN_IN_BROWSER = true
23
+
24
+ # ========================================================================= #
25
+ # === DEFAULT_FONT_TO_USE
26
+ # ========================================================================= #
27
+ DEFAULT_FONT_TO_USE = 'Helvetica'
28
+
29
+ # ========================================================================= #
30
+ # === DEFAULT_IMAGE_FORMAT
31
+ # ========================================================================= #
32
+ DEFAULT_IMAGE_FORMAT = 'PNG'
33
+
34
+ # ========================================================================= #
35
+ # === REGEX_FOR_SIZE
36
+ # ========================================================================= #
37
+ REGEX_FOR_SIZE = /(\d+x\d+)/
38
+
39
+ # ========================================================================= #
40
+ # === initialize
41
+ # ========================================================================= #
42
+ def initialize(
43
+ i = ARGV,
44
+ run_already = true
45
+ )
46
+ reset
47
+ set_label(i)
48
+ run if run_already
49
+ end
50
+
51
+ # ========================================================================= #
52
+ # === set_label
53
+ # ========================================================================= #
54
+ def set_label(i)
55
+ if i.is_a? Array
56
+ i = i.join(' ').strip
57
+ end
58
+ # ======================================================================= #
59
+ # Check whether the label includes a Dimension. This may be a conflict
60
+ # if the user REALLY wants to use some integer value, as part of the
61
+ # given label - but aside from this, I think in most other cases,
62
+ # this is a good default.
63
+ # ======================================================================= #
64
+ if i =~ REGEX_FOR_SIZE
65
+ size_dimension = $1.to_s.dup
66
+ set_size(size_dimension)
67
+ i.sub!(/#{size_dimension}/,'')
68
+ end
69
+ @label = i
70
+ end
71
+
72
+ # ========================================================================= #
73
+ # === reset
74
+ # ========================================================================= #
75
+ def reset
76
+ super()
77
+ @_ = ''.dup
78
+ @label = ''.dup
79
+ @background = 'lightblue'
80
+ @fill = 'blue'
81
+ @font = DEFAULT_FONT_TO_USE
82
+ @pointsize = '96'
83
+ @output_file = 'label.'+DEFAULT_IMAGE_FORMAT.downcase
84
+ set_size '250x75'
85
+ end
86
+
87
+ # ========================================================================= #
88
+ # === set_size
89
+ # ========================================================================= #
90
+ def set_size(i = '250x75')
91
+ @size = i.to_s
92
+ end
93
+
94
+ # ========================================================================= #
95
+ # === build_up_main_command
96
+ # ========================================================================= #
97
+ def build_up_main_command
98
+ @_ = 'convert'
99
+ add_default_background
100
+ add_default_fill
101
+ add_default_font
102
+ add_default_gravity
103
+ add_size
104
+ add_label
105
+ # add_default_pointsize # Do not add this option if you also added the default size.
106
+ add_output_file
107
+ end
108
+
109
+ # ========================================================================= #
110
+ # === add_size
111
+ # ========================================================================= #
112
+ def add_size
113
+ @_ << ' -size '+@size
114
+ end
115
+
116
+ # ========================================================================= #
117
+ # === add_default_background
118
+ # ========================================================================= #
119
+ def add_default_background
120
+ @_ << ' -background '+@background
121
+ end
122
+
123
+ # ========================================================================= #
124
+ # === add_default_font
125
+ # ========================================================================= #
126
+ def add_default_font
127
+ @_ << ' -font '+@font
128
+ end
129
+
130
+ # ========================================================================= #
131
+ # === add_label
132
+ # ========================================================================= #
133
+ def add_label
134
+ _ = @label
135
+ if _.include? ' '
136
+ _ = '"'+_+'"'
137
+ end
138
+ @_ << ' label:'+_
139
+ end
140
+
141
+ # ========================================================================= #
142
+ # === add_default_gravity
143
+ # ========================================================================= #
144
+ def add_default_gravity
145
+ @_ << ' -gravity center'
146
+ end
147
+
148
+ # ========================================================================= #
149
+ # === output_then_run_the_main_command
150
+ # ========================================================================= #
151
+ def output_then_run_the_main_command
152
+ esystem @_
153
+ end
154
+
155
+ # ========================================================================= #
156
+ # === add_output_file
157
+ # ========================================================================= #
158
+ def add_output_file
159
+ @_ << ' '+@output_file
160
+ end
161
+
162
+ # ========================================================================= #
163
+ # === output_file?
164
+ # ========================================================================= #
165
+ def output_file?
166
+ @output_file
167
+ end
168
+
169
+ # ========================================================================= #
170
+ # === add_default_pointsize
171
+ # ========================================================================= #
172
+ def add_default_pointsize
173
+ @_ << ' -pointsize '+@pointsize
174
+ end
175
+
176
+ # ========================================================================= #
177
+ # === add_default_fill
178
+ # ========================================================================= #
179
+ def add_default_fill
180
+ @_ << ' -fill '+@fill
181
+ end
182
+
183
+ # ========================================================================= #
184
+ # === consider_opening_in_the_browser
185
+ # ========================================================================= #
186
+ def consider_opening_in_the_browser
187
+ if DO_OPEN_IN_BROWSER
188
+ OpenInBrowser[output_file?]
189
+ end
190
+ end
191
+
192
+ # ========================================================================= #
193
+ # === run
194
+ # ========================================================================= #
195
+ def run
196
+ build_up_main_command
197
+ output_then_run_the_main_command
198
+ consider_opening_in_the_browser
199
+ end
200
+
201
+ end; end
202
+
203
+ if __FILE__ == $PROGRAM_NAME
204
+ ImageParadise::SimpleLabel.new(ARGV)
205
+ end # simple_label "Tomorrow is another day."
206
+ # simple_label "Tomorrow is another day. 500x250"