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,78 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::InsertButton
6
+ #
7
+ # require 'image_paradise/confree_generator/gui/insert_button.rb'
8
+ # =========================================================================== #
9
+ # This button is used to insert a line at the current iter.
10
+ # InsertButton.new
11
+ # =========================================================================== #
12
+ module ImageParadise
13
+
14
+ class InsertButton < Gtk::Button
15
+
16
+ include Gtk::Colours
17
+
18
+ # ========================================================================= #
19
+ # === initialize
20
+ # ========================================================================= #
21
+ def initialize(mode, master_widget)
22
+ super('Insert ' << mode.to_s.upcase)
23
+ set_mode(mode)
24
+ @master_widget = master_widget
25
+ self.modify_bg( Gtk::StateType::NORMAL, CADETBLUE )
26
+ self.modify_bg( Gtk::StateType::ACTIVE, BROWN )
27
+ self.modify_bg( Gtk::StateType::PRELIGHT, BISQUE )
28
+ self.set_size_request(66, 28)
29
+ self.set_border_width(0)
30
+ self.signal_connect(:clicked) { |widget, event| check_args(@mode) }
31
+ end
32
+
33
+ # ========================================================================= #
34
+ # === set_mode
35
+ # ========================================================================= #
36
+ def set_mode(i)
37
+ @mode = i
38
+ end
39
+
40
+ # ========================================================================= #
41
+ # === check_args
42
+ #
43
+ # Here we check for the different insert buttons.
44
+ # ========================================================================= #
45
+ def check_args(which_mode)
46
+ _ = @master_widget.source_buffer
47
+ case which_mode
48
+ when :comment
49
+ _.insert_at_cursor(
50
+ '# ===================================== #'+N)
51
+ _.insert_at_cursor(
52
+ '# '+N)
53
+ _.insert_at_cursor(
54
+ '# ===================================== #'+N)
55
+ when :background
56
+ _.insert_at_cursor('background { b -0.95 sat 1 hue 180 }')
57
+ when :square
58
+ _.insert_at_cursor('SQUARE {}')
59
+ when :triangle
60
+ _.insert_at_cursor('TRIANGLE {}')
61
+ when :line
62
+ _.insert_at_cursor('LINE {}')
63
+ when :rect
64
+ _.insert_at_cursor('RECT {}')
65
+ when :circle
66
+ _.insert_at_cursor('CIRCLE {}')
67
+ when :hue
68
+ _.insert_at_cursor(' hue 10 ')
69
+ when :sat
70
+ _.insert_at_cursor(' sat 0.995 ')
71
+ when :b
72
+ _.insert_at_cursor(' b 0.995 ')
73
+ when :n
74
+ _.insert_at_cursor("\n")
75
+ end
76
+ end
77
+
78
+ end; end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'image_paradise/confree_generator/reset.rb'
6
+ # =========================================================================== #
7
+ module ImageParadise
8
+
9
+ class ConfreeGenerator < ::ImageParadise::Base # === ImageParadise::ConfreeGenerator
10
+
11
+ # ========================================================================= #
12
+ # === reset (reset tag)
13
+ # ========================================================================= #
14
+ def reset
15
+ # ======================================================================= #
16
+ # === @try_to_open_the_generated_image_in_the_browser
17
+ # ======================================================================= #
18
+ @try_to_open_the_generated_image_in_the_browser =
19
+ TRY_TO_OPEN_THE_GENERATED_IMAGE_IN_THE_BROWSER
20
+ # ======================================================================= #
21
+ # === @create_image
22
+ # ======================================================================= #
23
+ @create_image = true
24
+ # ======================================================================= #
25
+ # The variable @html_file tells us where to store html stuff into.
26
+ #
27
+ # By default it will point at:
28
+ #
29
+ # /Depot/Images/Confree_Images.html
30
+ #
31
+ # ======================================================================= #
32
+ @html_file = "#{TEMP_IMAGES}Confree_Images.html"
33
+ # ======================================================================= #
34
+ # === @file_listing
35
+ # ======================================================================= #
36
+ @file_listing = nil # will contain files in my IMG/CFDG dir
37
+ @batch_mode = false
38
+ # ======================================================================= #
39
+ # === @n_confree_files
40
+ # ======================================================================= #
41
+ @n_confree_files = 0
42
+ set_location_of_output_file
43
+ set_width_then_height(
44
+ DEFAULT_WIDTH,
45
+ DEFAULT_HEIGHT
46
+ )
47
+ # ======================================================================= #
48
+ # === @create_html_gallery
49
+ # ======================================================================= #
50
+ @create_html_gallery = CREATE_HTML_GALLERY # If true, we create a html gallery.
51
+ # ======================================================================= #
52
+ # The next flag can be true or false.
53
+ #
54
+ # By default it should be true. If it is true, we will generate the
55
+ # image in question. Sometimes though, we may only want to generate
56
+ # the HTML code - that is why this variable exists.
57
+ # ======================================================================= #
58
+ @generate_the_image = GENERATE_THE_IMAGE
59
+ end
60
+
61
+ end; end
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::ConfreeGenerator::Shared
6
+ #
7
+ # Data to be exchanged between the different .rb files in the
8
+ # confree_generator project is bundled into this file here.
9
+ # =========================================================================== #
10
+ # require 'image_paradise/confree_generator/shared/shared.rb'
11
+ # =========================================================================== #
12
+ require 'image_paradise/confree_generator/constants.rb'
13
+ require 'image_paradise/base/base.rb'
14
+ require 'image_paradise/toplevel_methods/file_related_code.rb'
15
+
16
+ module ImageParadise
17
+
18
+ class ConfreeGenerator < ::ImageParadise::Base # === ImageParadise::ConfreeGenerator::Shared
19
+
20
+ module Shared # require 'confree_generator/shared.rb'; include Shared
21
+
22
+ include Colours
23
+
24
+ N = "\n" # Newline.
25
+
26
+ # ========================================================================= #
27
+ # === ARRAY_SKIP_THESE_FILES
28
+ #
29
+ # The following Array lists all .cfdg files which should be be part of
30
+ # what we return with "get_all_cfdg_files".
31
+ #
32
+ # Some .cfdg files that take notoriously long to process can be
33
+ # added to this array.
34
+ # ========================================================================= #
35
+ ARRAY_SKIP_THESE_CFDG_FILES = %w(
36
+ std_cfdg.cfdg
37
+ )
38
+
39
+ # ========================================================================= #
40
+ # Height and Width settings. Should not be too large because otherwise
41
+ # the generated image files may be really huge.
42
+ # ========================================================================= #
43
+
44
+ # ========================================================================= #
45
+ # === DEFAULT_HEIGHT
46
+ # ========================================================================= #
47
+ DEFAULT_HEIGHT = '420' # default height for an image
48
+
49
+ # ========================================================================= #
50
+ # === DEFAULT_WIDTH
51
+ # ========================================================================= #
52
+ DEFAULT_WIDTH = '280' # default width for an image
53
+
54
+ # ========================================================================= #
55
+ # === MY_CONFREE_DIR
56
+ #
57
+ # This constants defines the directory where our .cfdg files reside.
58
+ # You can either set an environment variable, called CFDG, or simply
59
+ # hardcode the value. This constant is very important for batch-processing.
60
+ # ========================================================================= #
61
+ if ENV['CFDG']
62
+ MY_CONFREE_DIR = ENV['CFDG'].to_s.dup+'/'
63
+ else
64
+ MY_CONFREE_DIR = '/Users/x/DATA/IMG/CFDG/' # '/tmp/'
65
+ end; DIRECTORY_WITH_CFDG_IMAGES = MY_CONFREE_DIR; CFDG_DIRECTORY = MY_CONFREE_DIR
66
+
67
+ # ========================================================================= #
68
+ # Where our TEMP dir is defined.
69
+ # ========================================================================= #
70
+ if ENV['MY_TEMP']
71
+ TEMP_DIR = ENV['MY_TEMP'].to_s.dup+'/'
72
+ else
73
+ TEMP_DIR = '/Depot/Temp/' # Hardcoded for now.
74
+ end
75
+ TEMP_IMAGES = '/Depot/Images/'
76
+ HTML_FILE_CONFREE_IMAGES = '/Depot/Information/Confree_Images.html'
77
+ YOUR_FAVOURITE_EDITOR = 'bluefish' # Your favourite editor comes here.
78
+
79
+ # ========================================================================= #
80
+ # === get_random_cfdg_file
81
+ #
82
+ # This method will obtain one random .cfdg file.
83
+ # ========================================================================= #
84
+ def get_random_cfdg_file(i = DIRECTORY_WITH_CFDG_IMAGES)
85
+ get_all_cfdg_files(i).sample
86
+ end; alias get_random_cfdg get_random_cfdg_file # === get_random_cfdg
87
+
88
+ # ========================================================================= #
89
+ # === get_all_cfdg_files
90
+ #
91
+ # This method will try to get all .cfdg files, except for
92
+ # all entries we stored in our Array at the top.
93
+ # ========================================================================= #
94
+ def get_all_cfdg_files(
95
+ i = DIRECTORY_WITH_CFDG_IMAGES
96
+ )
97
+ Dir["#{i}*.cfdg"] - ARRAY_SKIP_THESE_CFDG_FILES
98
+ end
99
+
100
+ end; end; end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'image_paradise/constants.rb'
6
+ # =========================================================================== #
7
+ module ImageParadise
8
+
9
+ require 'image_paradise/project/project.rb'
10
+
11
+ # ========================================================================= #
12
+ # === N
13
+ # ========================================================================= #
14
+ N = "\n"
15
+
16
+ # ========================================================================= #
17
+ # === ALPHABET
18
+ # ========================================================================= #
19
+ ALPHABET = ('a'..'z').to_a
20
+
21
+ # ========================================================================= #
22
+ # === DEFAULT_CROP_COMMAND_TO_USE
23
+ # ========================================================================= #
24
+ DEFAULT_CROP_COMMAND_TO_USE = '125x125+35+35'
25
+
26
+ # ========================================================================= #
27
+ # === DEFAULT_TEXT
28
+ #
29
+ # This is the default text.
30
+ # ========================================================================= #
31
+ DEFAULT_TEXT = 'Hello World!'
32
+
33
+ # ========================================================================= #
34
+ # === DEFAULT_FONT
35
+ # ========================================================================= #
36
+ DEFAULT_FONT = 'Terminus'
37
+
38
+ # ========================================================================= #
39
+ # === CONVERT
40
+ # ========================================================================= #
41
+ CONVERT = 'convert'
42
+
43
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'image_paradise/constants/image_file_types.rb'
6
+ # =========================================================================== #
7
+ module ImageParadise
8
+
9
+ # ========================================================================= #
10
+ # === ImageParadise::ARRAY_IMAGE_FILE_TYPES
11
+ # ========================================================================= #
12
+ ARRAY_IMAGE_FILE_TYPES = %w(
13
+ .png
14
+ .gif
15
+ .tiff
16
+ .jpg
17
+ .bmp
18
+ .ascii
19
+ )
20
+
21
+ end
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module ImageParadise
6
+
7
+ # ========================================================================= #
8
+ # === INPUT_IMAGES_FOR_THE_CREATION_OF_ANIMATED_GIFS
9
+ # ========================================================================= #
10
+ INPUT_IMAGES_FOR_THE_CREATION_OF_ANIMATED_GIFS = '*.gif'
11
+
12
+ # ========================================================================= #
13
+ # === DELAY_FOR_THE_CREATION_OF_ANIMATED_GIFS
14
+ # ========================================================================= #
15
+ DELAY_FOR_THE_CREATION_OF_ANIMATED_GIFS = '100'
16
+
17
+ # ========================================================================= #
18
+ # === ImageParadise.create_animated_gif
19
+ #
20
+ # This method will create an animated gif.
21
+ #
22
+ # The input should be either an Array of input_images, or a string which
23
+ # will be used to create the command.
24
+ #
25
+ # A delay of 100 means 1 second delay.
26
+ # ========================================================================= #
27
+ def self.create_animated_gif(
28
+ input_images = INPUT_IMAGES_FOR_THE_CREATION_OF_ANIMATED_GIFS,
29
+ delay = DELAY_FOR_THE_CREATION_OF_ANIMATED_GIFS
30
+ )
31
+ output_name = 'animated_gif.gif'
32
+ _ = 'convert -delay 100 -loop 0 '+input_images+' '+output_name
33
+ esystem _
34
+ e 'Finished creating `'+sfile(output_name)+'`.' if File.exist? output_name
35
+ end
36
+
37
+ # ========================================================================= #
38
+ # === create_animated_gif
39
+ # ========================================================================= #
40
+ def create_animated_gif(
41
+ input_images = INPUT_IMAGES_FOR_THE_CREATION_OF_ANIMATED_GIFS,
42
+ delay = DELAY_FOR_THE_CREATION_OF_ANIMATED_GIFS
43
+ )
44
+ ImageParadise.create_animated_gif(input_images, delay)
45
+ end
46
+
47
+ end
@@ -0,0 +1,302 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === ImageParadise::Crop
6
+ #
7
+ # This class can be used to crop an image file via ImageMagick.
8
+ #
9
+ # Usage example:
10
+ # require 'crop'
11
+ # ImageParadise::Crop.new
12
+ # =========================================================================== #
13
+ # require 'image_paradise/crop.rb'
14
+ # =========================================================================== #
15
+ require 'image_paradise/base/base.rb'
16
+
17
+ module ImageParadise
18
+
19
+ class Crop < ::ImageParadise::Base # === ImageParadise::Crop
20
+
21
+ # ========================================================================= #
22
+ # === CROP_COMMAND_TO_USE
23
+ # ========================================================================= #
24
+ CROP_COMMAND_TO_USE = '125x125+35+35'
25
+
26
+ # ========================================================================= #
27
+ # === CONVERT_COMMAND
28
+ # ========================================================================= #
29
+ CONVERT_COMMAND = 'convert'
30
+
31
+ # ========================================================================= #
32
+ # === TEMP_DIR
33
+ # ========================================================================= #
34
+ TEMP_DIR = '/Depot/Temp/'
35
+
36
+ # ========================================================================= #
37
+ # === initialize
38
+ # ========================================================================= #
39
+ def initialize(
40
+ input_filename = nil,
41
+ use_this_crop_command = nil,
42
+ run_already = true
43
+ )
44
+ reset
45
+ case input_filename
46
+ when :do_not_run_yetimage_shell
47
+ input_filename = nil
48
+ run_already = false
49
+ end
50
+ set_input_filename(input_filename)
51
+ set_use_this_crop_command(use_this_crop_command)
52
+ case run_already
53
+ when :dont_run_yet
54
+ run_already = false
55
+ end
56
+ run if run_already
57
+ end
58
+
59
+ # ========================================================================= #
60
+ # === reset (reset tag)
61
+ # ========================================================================= #
62
+ def reset
63
+ @be_verbose = true
64
+ @temp_dir = TEMP_DIR
65
+ @temp_dir = (Dir.pwd+'/').squeeze '/'
66
+ set_input_filename
67
+ set_output_file
68
+ end
69
+
70
+ # ========================================================================= #
71
+ # === input_filename?
72
+ # ========================================================================= #
73
+ def input_filename?
74
+ @input_filename.to_s
75
+ end; alias input? input_filename? # === input?
76
+
77
+ # ========================================================================= #
78
+ # === crop_command?
79
+ # ========================================================================= #
80
+ def crop_command?
81
+ @use_this_crop_command
82
+ end
83
+
84
+ # ========================================================================= #
85
+ # === synchronize_output_filename
86
+ # ========================================================================= #
87
+ def synchronize_output_filename
88
+ set_output_file :synchronize
89
+ end
90
+
91
+ # ========================================================================= #
92
+ # === be_verbose?
93
+ # ========================================================================= #
94
+ def be_verbose?
95
+ @be_verbose
96
+ end
97
+
98
+ # ========================================================================= #
99
+ # === perform_crop_action
100
+ #
101
+ # The first input shall be the filename we wish to crop.
102
+ #
103
+ # The second input shall be which specific crop command we will use.
104
+ # ========================================================================= #
105
+ def perform_crop_action(
106
+ crop_this_image = input?,
107
+ use_this_crop_command = crop_command?
108
+ )
109
+ if crop_this_image.is_a? Array
110
+ crop_this_image = crop_this_image.join(' ')
111
+ end
112
+ # ======================================================================= #
113
+ # Next convert both into Strings.
114
+ # ======================================================================= #
115
+ crop_this_image = crop_this_image.to_s
116
+ use_this_crop_command = use_this_crop_command.to_s
117
+ if use_this_crop_command.empty?
118
+ use_this_crop_command = DEFAULT_CROP_COMMAND_TO_USE
119
+ end
120
+ # ======================================================================= #
121
+ # The following means that the user passed only one +5 rather
122
+ # than two +5+5, hence we sanitize it here.
123
+ # ======================================================================= #
124
+ if use_this_crop_command.count('+') == 1
125
+ use_this_crop_command << use_this_crop_command[
126
+ use_this_crop_command.index('+')..-1
127
+ ]
128
+ end
129
+ if use_this_crop_command.include? '%'
130
+ use_this_crop_command << 'x+0+0' unless use_this_crop_command[0,1] == 'x'
131
+ end
132
+ set_crop_command(use_this_crop_command) # Synchronize it back here.
133
+ opn; e 'Next cropping the image `'+sfancy(crop_this_image)+'`.'
134
+ _ = CONVERT_COMMAND+' '+crop_this_image+
135
+ ' -crop '+use_this_crop_command+' '+output_file?
136
+ opn; Esystem.esystem(_)
137
+ report_where_the_file_is_now_stored if be_verbose?
138
+ return output_file?
139
+ end; alias do_crop perform_crop_action # === do_crop
140
+ alias crop perform_crop_action # === crop
141
+
142
+ # ========================================================================= #
143
+ # === report_where_the_file_is_now_stored
144
+ # ========================================================================= #
145
+ def report_where_the_file_is_now_stored
146
+ opn; e 'This should now be stored at '
147
+ opn; e " #{sfile(output_file?)}"
148
+ end
149
+
150
+ # ========================================================================= #
151
+ # === set_use_this_crop_command
152
+ # ========================================================================= #
153
+ def set_use_this_crop_command(i = nil)
154
+ i = CROP_COMMAND_TO_USE if i.nil?
155
+ i = i.join ' ' if i.is_a? Array
156
+ @use_this_crop_command = i
157
+ end; alias set_crop_command set_use_this_crop_command # === set_crop_command
158
+
159
+ # ========================================================================= #
160
+ # === output_file?
161
+ # ========================================================================= #
162
+ def output_file?
163
+ @output_file
164
+ end; alias result output_file? # === result
165
+ alias result? output_file? # === result?
166
+ alias output? output_file? # === output?
167
+
168
+ # ========================================================================= #
169
+ # === set_input_filename
170
+ #
171
+ # Whenever we modify the input filename, we also must update the
172
+ # output_filename.
173
+ # ========================================================================= #
174
+ def set_input_filename(i = nil)
175
+ i = i.first if i.is_a? Array
176
+ i = i.to_s.dup
177
+ @input_filename = i
178
+ synchronize_output_filename
179
+ end; alias input_file= set_input_filename # === input_file=
180
+
181
+ # ========================================================================= #
182
+ # === ImageParadise::Crop[]
183
+ #
184
+ # An alias to the above method.
185
+ # ========================================================================= #
186
+ def self.[](i, use_this_crop_command)
187
+ Crop.crop(i, use_this_crop_command)
188
+ end
189
+
190
+ # ========================================================================= #
191
+ # === ImageParadise::Crop.crop
192
+ #
193
+ # We purposely require two arguments here.
194
+ # ========================================================================= #
195
+ def self.crop(
196
+ crop_this_image,
197
+ use_this_crop_command,
198
+ optional_hash = {}
199
+ )
200
+ _ = Crop.new :do_not_run_yet
201
+ if optional_hash.has_key? :store_in_this_directory
202
+ _.set_store_here(
203
+ optional_hash.delete(:store_in_this_directory)
204
+ )
205
+ end
206
+ _.input_file = crop_this_image
207
+ result = _.crop(crop_this_image, use_this_crop_command)
208
+ return result
209
+ end
210
+
211
+ # ========================================================================= #
212
+ # === set_output_file
213
+ # ========================================================================= #
214
+ def set_output_file(
215
+ i = default_name_for_cropped_image
216
+ )
217
+ if i.nil? or i == :synchronize
218
+ i = default_name_for_cropped_image
219
+ end
220
+ i = (Dir.pwd+'/'+i).squeeze('/') unless i.include? '/'
221
+ @output_file = i
222
+ end
223
+
224
+ # ========================================================================= #
225
+ # === default_name_for_cropped_image
226
+ # ========================================================================= #
227
+ def default_name_for_cropped_image
228
+ temp_dir?+'CROPPED_IMAGE_'+today+'_'+File.basename(input?)
229
+ end
230
+
231
+ # ========================================================================= #
232
+ # === temp_dir?
233
+ # ========================================================================= #
234
+ def temp_dir?
235
+ @temp_dir
236
+ end
237
+
238
+ # ========================================================================= #
239
+ # === set_store_here
240
+ # ========================================================================= #
241
+ def set_store_here(i)
242
+ i << '/' unless i.end_with? '/'
243
+ @temp_dir = i
244
+ end
245
+
246
+ # ========================================================================= #
247
+ # === run_everything
248
+ # ========================================================================= #
249
+ def run_everything
250
+ perform_crop_action # This here will do the actual cropping.
251
+ end
252
+
253
+ # ========================================================================= #
254
+ # === run (run tag)
255
+ # ========================================================================= #
256
+ def run
257
+ run_everything
258
+ end
259
+
260
+ end
261
+
262
+ # ========================================================================= #
263
+ # === ImageParadise.crop
264
+ #
265
+ # Use this toplevel-method in order to crop an image.
266
+ #
267
+ # If we omit the second argument then we will use the default setting,
268
+ # which should be sufficiently useful enough to yield a cropped image.
269
+ #
270
+ # The "-crop" operator also understands how to crop an image to just
271
+ # a percentage of its original size.
272
+ #
273
+ # For example, this would half the size of the image:
274
+ # convert foo.png -crop 50%x+0+0 CROPPED_foo.png
275
+ #
276
+ # The first argument to this method shall be the filename that we wish
277
+ # to modify.
278
+ #
279
+ # The second argument is the specific image manipulation we wish to
280
+ # apply onto that image.
281
+ #
282
+ # Usage example:
283
+ # ImageParadise.crop('foo.png','40x30+10+10')
284
+ # ========================================================================= #
285
+ # Official documentation for crop-related actions in regards to
286
+ # ImageMagick can be found here:
287
+ #
288
+ # http://www.imagemagick.org/script/command-line-options.php?#crop
289
+ # ========================================================================= #
290
+ def self.crop(
291
+ i, # The input-ile is a mandatory argument.
292
+ crop_command_to_use = DEFAULT_CROP_COMMAND_TO_USE,
293
+ optional_hash = {}
294
+ )
295
+ ::ImageParadise::Crop.crop(i, crop_command_to_use, optional_hash)
296
+ end
297
+
298
+ end
299
+
300
+ if __FILE__ == $PROGRAM_NAME
301
+ ImageParadise::Crop.new(ARGV[0], ARGV[1])
302
+ end # crop