image_paradise 0.4.20

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 (650) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +38 -0
  3. data/README.md +1015 -0
  4. data/USAGE.md +10 -0
  5. data/bin/black_white +10 -0
  6. data/bin/confree_generator +7 -0
  7. data/bin/create_new_image +7 -0
  8. data/bin/display_text_from_this_image +7 -0
  9. data/bin/draw_as_specified_from_the_yaml_file +7 -0
  10. data/bin/embed_the_filename_into_this_image +7 -0
  11. data/bin/image_paradise +7 -0
  12. data/bin/image_paradise_shell +7 -0
  13. data/bin/image_to_ascii +54 -0
  14. data/bin/image_to_pdf +7 -0
  15. data/bin/imageparadise_img2pdf +12 -0
  16. data/bin/img_text +14 -0
  17. data/bin/interlace +7 -0
  18. data/bin/jpg_to_pdf +12 -0
  19. data/bin/magic_card_border +8 -0
  20. data/bin/make_this_image_transparent +7 -0
  21. data/bin/morph_these_images +7 -0
  22. data/bin/optimize_this_image +7 -0
  23. data/bin/quality +7 -0
  24. data/bin/rename_this_file_based_on_metadata_information +7 -0
  25. data/bin/resize_by_percent +10 -0
  26. data/bin/rotate_left +7 -0
  27. data/bin/rotate_right +7 -0
  28. data/bin/round_the_corner +7 -0
  29. data/bin/ruby_montage +7 -0
  30. data/bin/transparent +15 -0
  31. data/doc/README.gen +936 -0
  32. data/doc/todo/TODO_FOR_THE_GTK_GUI.md +9 -0
  33. data/doc/todo/TODO_FOR_THE_IMAGE_PARADISE_PROJECT.md +20 -0
  34. data/doc/todo/TODO_WORK_THROUGH_THESE_LINKS.md +3 -0
  35. data/doc/todo/todo_for_the_libui_gui.md +6 -0
  36. data/image_paradise.gemspec +46 -0
  37. data/images/IMAGE_PARADISE_LOGO.png +0 -0
  38. data/lib/image_paradise/base/base.rb +324 -0
  39. data/lib/image_paradise/cfdg/1dca_pattern.cfdg +48 -0
  40. data/lib/image_paradise/cfdg/3d_coloured_cube.cfdg +95 -0
  41. data/lib/image_paradise/cfdg/a_3D_spiral.cfdg +40 -0
  42. data/lib/image_paradise/cfdg/a_chaotic_city.cfdg +156 -0
  43. data/lib/image_paradise/cfdg/a_coloured_red.cfdg +21 -0
  44. data/lib/image_paradise/cfdg/a_daisy_flower.cfdg +66 -0
  45. data/lib/image_paradise/cfdg/a_decorated_window.cfdg +74 -0
  46. data/lib/image_paradise/cfdg/a_human_profile.cfdg +303 -0
  47. data/lib/image_paradise/cfdg/a_lost_heart.cfdg +28 -0
  48. data/lib/image_paradise/cfdg/a_plant_root.cfdg +26 -0
  49. data/lib/image_paradise/cfdg/a_rather_realistic_forest.cfdg +29 -0
  50. data/lib/image_paradise/cfdg/a_shoreline_next_to_a_forest.cfdg +127 -0
  51. data/lib/image_paradise/cfdg/a_simple_mini_brain.cfdg +17 -0
  52. data/lib/image_paradise/cfdg/a_simple_star.cfdg +22 -0
  53. data/lib/image_paradise/cfdg/adorned_tree.cfdg +58 -0
  54. data/lib/image_paradise/cfdg/adsorption.cfdg +19 -0
  55. data/lib/image_paradise/cfdg/alfabet_free.cfdg +346 -0
  56. data/lib/image_paradise/cfdg/alfreebet.cfdg +229 -0
  57. data/lib/image_paradise/cfdg/algal_flora.cfdg +25 -0
  58. data/lib/image_paradise/cfdg/alien_eyeball.cfdg +15 -0
  59. data/lib/image_paradise/cfdg/alien_flower.cfdg +35 -0
  60. data/lib/image_paradise/cfdg/alphabet_circles.cfdg +38 -0
  61. data/lib/image_paradise/cfdg/alveolo.cfdg +38 -0
  62. data/lib/image_paradise/cfdg/an_icosahedron.cfdg +134 -0
  63. data/lib/image_paradise/cfdg/an_oils_surface.cfdg +48 -0
  64. data/lib/image_paradise/cfdg/ancient_map.cfdg +30 -0
  65. data/lib/image_paradise/cfdg/ancient_scripts_tile.cfdg +96 -0
  66. data/lib/image_paradise/cfdg/angelfish.cfdg +58 -0
  67. data/lib/image_paradise/cfdg/angry_yarn.cfdg +82 -0
  68. data/lib/image_paradise/cfdg/apple_tree_small.cfdg +46 -0
  69. data/lib/image_paradise/cfdg/aqua_star.cfdg +27 -0
  70. data/lib/image_paradise/cfdg/army_explosion.cfdg +25 -0
  71. data/lib/image_paradise/cfdg/arrows_in_quadcity.cfdg +143 -0
  72. data/lib/image_paradise/cfdg/artificial_intelligence.cfdg +41 -0
  73. data/lib/image_paradise/cfdg/askew.cfdg +27 -0
  74. data/lib/image_paradise/cfdg/audio_diagram_waves.cfdg +54 -0
  75. data/lib/image_paradise/cfdg/autumn_fractal.cfdg +39 -0
  76. data/lib/image_paradise/cfdg/baignoire.cfdg +33 -0
  77. data/lib/image_paradise/cfdg/barcode.cfdg +781 -0
  78. data/lib/image_paradise/cfdg/basic_polygon_shapes.cfdg +311 -0
  79. data/lib/image_paradise/cfdg/basic_spreaders.cfdg +52 -0
  80. data/lib/image_paradise/cfdg/basic_square.cfdg +8 -0
  81. data/lib/image_paradise/cfdg/bats_hiding_in_foliage.cfdg +19 -0
  82. data/lib/image_paradise/cfdg/bees.cfdg +61 -0
  83. data/lib/image_paradise/cfdg/bent_squares.cfdg +46 -0
  84. data/lib/image_paradise/cfdg/benzo_dreaming.cfdg +54 -0
  85. data/lib/image_paradise/cfdg/beta_bet.cfdg +645 -0
  86. data/lib/image_paradise/cfdg/big_bang_theory.cfdg +31 -0
  87. data/lib/image_paradise/cfdg/big_pacman.cfdg +70 -0
  88. data/lib/image_paradise/cfdg/bigger_tree.cfdg +64 -0
  89. data/lib/image_paradise/cfdg/binary_connection.cfdg +34 -0
  90. data/lib/image_paradise/cfdg/birch_line.cfdg +57 -0
  91. data/lib/image_paradise/cfdg/blacksmith_masterpiece.cfdg +3 -0
  92. data/lib/image_paradise/cfdg/blocked_rectangles.cfdg +23 -0
  93. data/lib/image_paradise/cfdg/blood_tubes.cfdg +45 -0
  94. data/lib/image_paradise/cfdg/bloom.cfdg +23 -0
  95. data/lib/image_paradise/cfdg/blown_glass_spheres.cfdg +30 -0
  96. data/lib/image_paradise/cfdg/blue_daisies_in_detail.cfdg +101 -0
  97. data/lib/image_paradise/cfdg/blue_galaxy.cfdg +20 -0
  98. data/lib/image_paradise/cfdg/blue_moon.cfdg +36 -0
  99. data/lib/image_paradise/cfdg/boa_feathers.cfdg +53 -0
  100. data/lib/image_paradise/cfdg/bomb.cfdg +75 -0
  101. data/lib/image_paradise/cfdg/boxy_continent.cfdg +111 -0
  102. data/lib/image_paradise/cfdg/bright_coloured_neurons.cfdg +53 -0
  103. data/lib/image_paradise/cfdg/brightness_flower.cfdg +31 -0
  104. data/lib/image_paradise/cfdg/btp_71_beautiful_coloured_lines.cfdg +85 -0
  105. data/lib/image_paradise/cfdg/btp_73.cfdg +76 -0
  106. data/lib/image_paradise/cfdg/bubblesun.cfdg +46 -0
  107. data/lib/image_paradise/cfdg/burning_bush.cfdg +31 -0
  108. data/lib/image_paradise/cfdg/butterflies_in_the_moonlight.cfdg +55 -0
  109. data/lib/image_paradise/cfdg/cardiod_arc.cfdg +44 -0
  110. data/lib/image_paradise/cfdg/cardioid.cfdg +41 -0
  111. data/lib/image_paradise/cfdg/caros_wallpaper.cfdg +46 -0
  112. data/lib/image_paradise/cfdg/cartoony_face_arrays.cfdg +137 -0
  113. data/lib/image_paradise/cfdg/centerfold.cfdg +12 -0
  114. data/lib/image_paradise/cfdg/chain_link_fence.cfdg +31 -0
  115. data/lib/image_paradise/cfdg/chanukah.cfdg +109 -0
  116. data/lib/image_paradise/cfdg/chaos_red_sun.cfdg +42 -0
  117. data/lib/image_paradise/cfdg/chaotic_farn.cfdg +76 -0
  118. data/lib/image_paradise/cfdg/chaotic_fractal_shell.cfdg +41 -0
  119. data/lib/image_paradise/cfdg/charleston.cfdg +182 -0
  120. data/lib/image_paradise/cfdg/ciliasun.cfdg +109 -0
  121. data/lib/image_paradise/cfdg/cipal.cfdg +65 -0
  122. data/lib/image_paradise/cfdg/circuits.cfdg +176 -0
  123. data/lib/image_paradise/cfdg/city_map.cfdg +66 -0
  124. data/lib/image_paradise/cfdg/clifford_torus.cfdg +135 -0
  125. data/lib/image_paradise/cfdg/colonize_flat_colour_pattern.cfdg +14 -0
  126. data/lib/image_paradise/cfdg/colour_blind_squid.cfdg +30 -0
  127. data/lib/image_paradise/cfdg/colour_hole.cfdg +56 -0
  128. data/lib/image_paradise/cfdg/colour_wheel.cfdg +40 -0
  129. data/lib/image_paradise/cfdg/coloured_eyes.cfdg +40 -0
  130. data/lib/image_paradise/cfdg/coloured_forest.cfdg +133 -0
  131. data/lib/image_paradise/cfdg/coloured_tree.cfdg +50 -0
  132. data/lib/image_paradise/cfdg/colourful_lives.cfdg +123 -0
  133. data/lib/image_paradise/cfdg/colourful_neuronal_network.cfdg +32 -0
  134. data/lib/image_paradise/cfdg/complex_city_plans.cfdg +75 -0
  135. data/lib/image_paradise/cfdg/complex_kritworks.cfdg +75 -0
  136. data/lib/image_paradise/cfdg/complex_snowflake.cfdg +61 -0
  137. data/lib/image_paradise/cfdg/conspiracy_theory.cfdg +104 -0
  138. data/lib/image_paradise/cfdg/constellation_grid.cfdg +29 -0
  139. data/lib/image_paradise/cfdg/cool_caterpillar.cfdg +44 -0
  140. data/lib/image_paradise/cfdg/coolcubes.cfdg +70 -0
  141. data/lib/image_paradise/cfdg/crawler_battle.cfdg +93 -0
  142. data/lib/image_paradise/cfdg/crazy_octo.cfdg +48 -0
  143. data/lib/image_paradise/cfdg/cthulhu.cfdg +166 -0
  144. data/lib/image_paradise/cfdg/cubies.cfdg +43 -0
  145. data/lib/image_paradise/cfdg/cubist_sunset.cfdg +55 -0
  146. data/lib/image_paradise/cfdg/curled_tree.cfdg +37 -0
  147. data/lib/image_paradise/cfdg/curls.cfdg +45 -0
  148. data/lib/image_paradise/cfdg/curve_stiched.cfdg +59 -0
  149. data/lib/image_paradise/cfdg/curved_tubes.cfdg +20 -0
  150. data/lib/image_paradise/cfdg/cylinder_city.cfdg +27 -0
  151. data/lib/image_paradise/cfdg/cymbal.cfdg +38 -0
  152. data/lib/image_paradise/cfdg/d_mustard.cfdg +52 -0
  153. data/lib/image_paradise/cfdg/dance_party.cfdg +81 -0
  154. data/lib/image_paradise/cfdg/dance_party_and_background.cfdg +86 -0
  155. data/lib/image_paradise/cfdg/decreasing_aperture.cfdg +16 -0
  156. data/lib/image_paradise/cfdg/delicat_twist.cfdg +13 -0
  157. data/lib/image_paradise/cfdg/demo_text.cfdg +22 -0
  158. data/lib/image_paradise/cfdg/dennis_ritchie.cfdg +294 -0
  159. data/lib/image_paradise/cfdg/diablo.cfdg +47 -0
  160. data/lib/image_paradise/cfdg/different_flowers.cfdg +60 -0
  161. data/lib/image_paradise/cfdg/different_snowflakes_shapes.cfdg +149 -0
  162. data/lib/image_paradise/cfdg/dimensions.cfdg +33 -0
  163. data/lib/image_paradise/cfdg/domino_pieces.cfdg +166 -0
  164. data/lib/image_paradise/cfdg/dong.cfdg +41 -0
  165. data/lib/image_paradise/cfdg/drip_shape.cfdg +24 -0
  166. data/lib/image_paradise/cfdg/earthday2007b.cfdg +49 -0
  167. data/lib/image_paradise/cfdg/edera_circles.cfdg +55 -0
  168. data/lib/image_paradise/cfdg/eight_queens_problem.cfdg +85 -0
  169. data/lib/image_paradise/cfdg/electro_shock.cfdg +88 -0
  170. data/lib/image_paradise/cfdg/enter_the_force_field.cfdg +56 -0
  171. data/lib/image_paradise/cfdg/escargot_fleur.cfdg +98 -0
  172. data/lib/image_paradise/cfdg/european_city.cfdg +63 -0
  173. data/lib/image_paradise/cfdg/evil_eye.cfdg +74 -0
  174. data/lib/image_paradise/cfdg/evolving_coloured_spots.cfdg +47 -0
  175. data/lib/image_paradise/cfdg/excellines_nr2.cfdg +171 -0
  176. data/lib/image_paradise/cfdg/exoplanet_settlement.cfdg +117 -0
  177. data/lib/image_paradise/cfdg/explosion.cfdg +45 -0
  178. data/lib/image_paradise/cfdg/explosion_of_a_megabyte.cfdg +73 -0
  179. data/lib/image_paradise/cfdg/eye_of_katora.cfdg +20 -0
  180. data/lib/image_paradise/cfdg/family_tree.cfdg +169 -0
  181. data/lib/image_paradise/cfdg/feathers.cfdg +17 -0
  182. data/lib/image_paradise/cfdg/ferma_drawings.cfdg +23 -0
  183. data/lib/image_paradise/cfdg/fevrier.cfdg +66 -0
  184. data/lib/image_paradise/cfdg/fibmod.cfdg +25 -0
  185. data/lib/image_paradise/cfdg/field_of_boxes.cfdg +21 -0
  186. data/lib/image_paradise/cfdg/finetre.cfdg +34 -0
  187. data/lib/image_paradise/cfdg/fireblorks.cfdg +37 -0
  188. data/lib/image_paradise/cfdg/first_branch.cfdg +18 -0
  189. data/lib/image_paradise/cfdg/fish_with_coloured_bubbles.cfdg +77 -0
  190. data/lib/image_paradise/cfdg/fishing_lure.cfdg +30 -0
  191. data/lib/image_paradise/cfdg/flake.cfdg +20 -0
  192. data/lib/image_paradise/cfdg/flaming_spiro.cfdg +10 -0
  193. data/lib/image_paradise/cfdg/fleshflower.cfdg +25 -0
  194. data/lib/image_paradise/cfdg/flourescent_fish_btp.cfdg +48 -0
  195. data/lib/image_paradise/cfdg/flow_control_shape.cfdg +45 -0
  196. data/lib/image_paradise/cfdg/flower_galaxy.cfdg +57 -0
  197. data/lib/image_paradise/cfdg/flower_house.cfdg +115 -0
  198. data/lib/image_paradise/cfdg/flower_stories.cfdg +136 -0
  199. data/lib/image_paradise/cfdg/fluctuating_heart.cfdg +87 -0
  200. data/lib/image_paradise/cfdg/fly_agaric.cfdg +22 -0
  201. data/lib/image_paradise/cfdg/forest_and_ocean.cfdg +65 -0
  202. data/lib/image_paradise/cfdg/fractal_fern.cfdg +15 -0
  203. data/lib/image_paradise/cfdg/fractal_shell.cfdg +36 -0
  204. data/lib/image_paradise/cfdg/frost_bite.cfdg +23 -0
  205. data/lib/image_paradise/cfdg/fun_with_paper.cfdg +17 -0
  206. data/lib/image_paradise/cfdg/func_plot.cfdg +59 -0
  207. data/lib/image_paradise/cfdg/funky_squiggle.cfdg +40 -0
  208. data/lib/image_paradise/cfdg/fuzzy_sun.cfdg +47 -0
  209. data/lib/image_paradise/cfdg/galaxy.cfdg +59 -0
  210. data/lib/image_paradise/cfdg/gallery.cfdg +28 -0
  211. data/lib/image_paradise/cfdg/game1_turn6.cfdg +35 -0
  212. data/lib/image_paradise/cfdg/garland.cfdg +42 -0
  213. data/lib/image_paradise/cfdg/general_polygons.cfdg +20 -0
  214. data/lib/image_paradise/cfdg/generational_birds.cfdg +118 -0
  215. data/lib/image_paradise/cfdg/ghostly_spine.cfdg +24 -0
  216. data/lib/image_paradise/cfdg/gift_wrapping.cfdg +46 -0
  217. data/lib/image_paradise/cfdg/glass_cubes.cfdg +33 -0
  218. data/lib/image_paradise/cfdg/gleaming_bush.cfdg +33 -0
  219. data/lib/image_paradise/cfdg/glowing_bush.cfdg +33 -0
  220. data/lib/image_paradise/cfdg/go_grid.cfdg +32 -0
  221. data/lib/image_paradise/cfdg/gold_tiles.cfdg +21 -0
  222. data/lib/image_paradise/cfdg/golden_rectangle.cfdg +19 -0
  223. data/lib/image_paradise/cfdg/golden_sierpinski.cfdg +49 -0
  224. data/lib/image_paradise/cfdg/golgi_stain.cfdg +74 -0
  225. data/lib/image_paradise/cfdg/gothic_bath_tiles.cfdg +14 -0
  226. data/lib/image_paradise/cfdg/grass_land.cfdg +112 -0
  227. data/lib/image_paradise/cfdg/gray_matter.cfdg +110 -0
  228. data/lib/image_paradise/cfdg/great_forest.cfdg +91 -0
  229. data/lib/image_paradise/cfdg/growth.cfdg +46 -0
  230. data/lib/image_paradise/cfdg/gumtree.cfdg +28 -0
  231. data/lib/image_paradise/cfdg/haggards_bull.cfdg +92 -0
  232. data/lib/image_paradise/cfdg/haight_ashbury.cfdg +882 -0
  233. data/lib/image_paradise/cfdg/hair_pattern.cfdg +59 -0
  234. data/lib/image_paradise/cfdg/hairy.cfdg +43 -0
  235. data/lib/image_paradise/cfdg/hairy_branch.cfdg +48 -0
  236. data/lib/image_paradise/cfdg/hands_and_feet.cfdg +49 -0
  237. data/lib/image_paradise/cfdg/happy_new_year.cfdg +3435 -0
  238. data/lib/image_paradise/cfdg/hatagu_lila_spiral.cfdg +27 -0
  239. data/lib/image_paradise/cfdg/hexaeder_triangle.cfdg +43 -0
  240. data/lib/image_paradise/cfdg/hexclouds_textures.cfdg +75 -0
  241. data/lib/image_paradise/cfdg/hextiles.cfdg +73 -0
  242. data/lib/image_paradise/cfdg/hexy_continent.cfdg +83 -0
  243. data/lib/image_paradise/cfdg/human_ballet.cfdg +215 -0
  244. data/lib/image_paradise/cfdg/human_eyes.cfdg +102 -0
  245. data/lib/image_paradise/cfdg/hydra_tail.cfdg +57 -0
  246. data/lib/image_paradise/cfdg/i_like_it_dirty.cfdg +88 -0
  247. data/lib/image_paradise/cfdg/i_pix.cfdg +679 -0
  248. data/lib/image_paradise/cfdg/imaginary_star.cfdg +55 -0
  249. data/lib/image_paradise/cfdg/imaginery_forest.cfdg +61 -0
  250. data/lib/image_paradise/cfdg/impossible_stairs.cfdg +211 -0
  251. data/lib/image_paradise/cfdg/in_the_morning.cfdg +83 -0
  252. data/lib/image_paradise/cfdg/inertial_confinement.cfdg +150 -0
  253. data/lib/image_paradise/cfdg/infected_shell.cfdg +56 -0
  254. data/lib/image_paradise/cfdg/insect_fight.cfdg +316 -0
  255. data/lib/image_paradise/cfdg/insectivore.cfdg +80 -0
  256. data/lib/image_paradise/cfdg/interference.cfdg +43 -0
  257. data/lib/image_paradise/cfdg/interference_fields.cfdg +25 -0
  258. data/lib/image_paradise/cfdg/into_the_deep.cfdg +96 -0
  259. data/lib/image_paradise/cfdg/inverted_decorations.cfdg +85 -0
  260. data/lib/image_paradise/cfdg/irregular_galaxies.cfdg +29 -0
  261. data/lib/image_paradise/cfdg/iso_blocks.cfdg +35 -0
  262. data/lib/image_paradise/cfdg/jewelry_old_style.cfdg +31 -0
  263. data/lib/image_paradise/cfdg/just_some_flowers.cfdg +127 -0
  264. data/lib/image_paradise/cfdg/kaboom.cfdg +40 -0
  265. data/lib/image_paradise/cfdg/kaleidoskop.cfdg +27 -0
  266. data/lib/image_paradise/cfdg/kama_sutra.cfdg +182 -0
  267. data/lib/image_paradise/cfdg/kitakoa_akiyoshi_illusions_roller.cfdg +40 -0
  268. data/lib/image_paradise/cfdg/koch_snowflake.cfdg +11 -0
  269. data/lib/image_paradise/cfdg/kochlea.cfdg +43 -0
  270. data/lib/image_paradise/cfdg/kreepykrawler.cfdg +48 -0
  271. data/lib/image_paradise/cfdg/kw_expanded_explosion.cfdg +46 -0
  272. data/lib/image_paradise/cfdg/lapsang_abstrait.cfdg +51 -0
  273. data/lib/image_paradise/cfdg/laser.cfdg +51 -0
  274. data/lib/image_paradise/cfdg/last_pluto_dream.cfdg +95 -0
  275. data/lib/image_paradise/cfdg/lazy_dust.cfdg +42 -0
  276. data/lib/image_paradise/cfdg/lesson_one_two_three_four.cfdg +217 -0
  277. data/lib/image_paradise/cfdg/lila_lili.cfdg +60 -0
  278. data/lib/image_paradise/cfdg/lindenmayergrassef2_pretty_flowers.cfdg +94 -0
  279. data/lib/image_paradise/cfdg/lines_from_excel.cfdg +136 -0
  280. data/lib/image_paradise/cfdg/looking_out.cfdg +51 -0
  281. data/lib/image_paradise/cfdg/looking_up_in_the_sky.cfdg +43 -0
  282. data/lib/image_paradise/cfdg/lotus_logo.cfdg +49 -0
  283. data/lib/image_paradise/cfdg/lowercased_alphabet.cfdg +565 -0
  284. data/lib/image_paradise/cfdg/luma_smiley.cfdg +563 -0
  285. data/lib/image_paradise/cfdg/maggi_stars.cfdg +11 -0
  286. data/lib/image_paradise/cfdg/mandelbrot_3.cfdg +111 -0
  287. data/lib/image_paradise/cfdg/martini.cfdg +147 -0
  288. data/lib/image_paradise/cfdg/material_studies.cfdg +172 -0
  289. data/lib/image_paradise/cfdg/math_eye.cfdg +30 -0
  290. data/lib/image_paradise/cfdg/matrix_freestyle.cfdg +127 -0
  291. data/lib/image_paradise/cfdg/maze.cfdg +211 -0
  292. data/lib/image_paradise/cfdg/meaculpo.cfdg +46 -0
  293. data/lib/image_paradise/cfdg/medieval_madness.cfdg +140 -0
  294. data/lib/image_paradise/cfdg/menage_a_trois.cfdg +77 -0
  295. data/lib/image_paradise/cfdg/micky_mouse.cfdg +75 -0
  296. data/lib/image_paradise/cfdg/mistletoe_forest.cfdg +62 -0
  297. data/lib/image_paradise/cfdg/mixed_simple_bubbles.cfdg +20 -0
  298. data/lib/image_paradise/cfdg/mod4g_starhole.cfdg +27 -0
  299. data/lib/image_paradise/cfdg/moebius.cfdg +57 -0
  300. data/lib/image_paradise/cfdg/molecules.cfdg +30 -0
  301. data/lib/image_paradise/cfdg/momos_blossom.cfdg +70 -0
  302. data/lib/image_paradise/cfdg/mona_lisa.cfdg +7937 -0
  303. data/lib/image_paradise/cfdg/more_arrows_in_quadcity.cfdg +49 -0
  304. data/lib/image_paradise/cfdg/more_cats.cfdg +1002 -0
  305. data/lib/image_paradise/cfdg/mosaic_for_2D_games.cfdg +69 -0
  306. data/lib/image_paradise/cfdg/mr_bezier.cfdg +195 -0
  307. data/lib/image_paradise/cfdg/mtree.cfdg +33 -0
  308. data/lib/image_paradise/cfdg/multiple_triangles.cfdg +13 -0
  309. data/lib/image_paradise/cfdg/mycel.cfdg +88 -0
  310. data/lib/image_paradise/cfdg/mytohexagone.cfdg +56 -0
  311. data/lib/image_paradise/cfdg/nature_is_not_like_that.cfdg +48 -0
  312. data/lib/image_paradise/cfdg/negative_flowers.cfdg +85 -0
  313. data/lib/image_paradise/cfdg/neo_town.cfdg +41 -0
  314. data/lib/image_paradise/cfdg/nesting_pattern.cfdg +34 -0
  315. data/lib/image_paradise/cfdg/neuronal_network.cfdg +94 -0
  316. data/lib/image_paradise/cfdg/neuronal_root.cfdg +46 -0
  317. data/lib/image_paradise/cfdg/night.cfdg +82 -0
  318. data/lib/image_paradise/cfdg/nightwalker.cfdg +23 -0
  319. data/lib/image_paradise/cfdg/no_xcape.cfdg +41 -0
  320. data/lib/image_paradise/cfdg/noise.cfdg +12 -0
  321. data/lib/image_paradise/cfdg/octopodi.cfdg +51 -0
  322. data/lib/image_paradise/cfdg/octopussy.cfdg +49 -0
  323. data/lib/image_paradise/cfdg/oldschool_cartoon_figure.cfdg +181 -0
  324. data/lib/image_paradise/cfdg/open_shapes.cfdg +240 -0
  325. data/lib/image_paradise/cfdg/orange_blossom.cfdg +57 -0
  326. data/lib/image_paradise/cfdg/orange_guts.cfdg +43 -0
  327. data/lib/image_paradise/cfdg/orange_monster.cfdg +42 -0
  328. data/lib/image_paradise/cfdg/organic.cfdg +30 -0
  329. data/lib/image_paradise/cfdg/ouo_happy_smiley.cfdg +45 -0
  330. data/lib/image_paradise/cfdg/output.png +0 -0
  331. data/lib/image_paradise/cfdg/pacman.cfdg +18 -0
  332. data/lib/image_paradise/cfdg/palmen.cfdg +162 -0
  333. data/lib/image_paradise/cfdg/pandoras_box.cfdg +53 -0
  334. data/lib/image_paradise/cfdg/papillon_butterfly.cfdg +28 -0
  335. data/lib/image_paradise/cfdg/patchwork.cfdg +32 -0
  336. data/lib/image_paradise/cfdg/pattern_grass.cfdg +110 -0
  337. data/lib/image_paradise/cfdg/peau_de_grenouille.cfdg +16 -0
  338. data/lib/image_paradise/cfdg/penrose_tiling.cfdg +102 -0
  339. data/lib/image_paradise/cfdg/pentagon.cfdg +68 -0
  340. data/lib/image_paradise/cfdg/pentagons.cfdg +25 -0
  341. data/lib/image_paradise/cfdg/perspective_tsunami.cfdg +20 -0
  342. data/lib/image_paradise/cfdg/phi_cloud.cfdg +23 -0
  343. data/lib/image_paradise/cfdg/picnic_birds_eye_view.cfdg +132 -0
  344. data/lib/image_paradise/cfdg/ping_pong.cfdg +29 -0
  345. data/lib/image_paradise/cfdg/pink_blossom.cfdg +58 -0
  346. data/lib/image_paradise/cfdg/piupole.cfdg +77 -0
  347. data/lib/image_paradise/cfdg/plotting.cfdg +61 -0
  348. data/lib/image_paradise/cfdg/point_onto_root.cfdg +64 -0
  349. data/lib/image_paradise/cfdg/primitive_reptile_pattern.cfdg +96 -0
  350. data/lib/image_paradise/cfdg/psycho_knot.cfdg +20 -0
  351. data/lib/image_paradise/cfdg/pyramide.cfdg +67 -0
  352. data/lib/image_paradise/cfdg/pythagoras_puzzle.cfdg +17 -0
  353. data/lib/image_paradise/cfdg/pythagorean_tree.cfdg +70 -0
  354. data/lib/image_paradise/cfdg/qimica.cfdg +64 -0
  355. data/lib/image_paradise/cfdg/quad_green_satellite.cfdg +53 -0
  356. data/lib/image_paradise/cfdg/quadcity.cfdg +24 -0
  357. data/lib/image_paradise/cfdg/quiet_wood_town.cfdg +195 -0
  358. data/lib/image_paradise/cfdg/r180.cfdg +26 -0
  359. data/lib/image_paradise/cfdg/r45.cfdg +26 -0
  360. data/lib/image_paradise/cfdg/r_square.cfdg +36 -0
  361. data/lib/image_paradise/cfdg/rads.cfdg +33 -0
  362. data/lib/image_paradise/cfdg/rainbow_black_hole.cfdg +9 -0
  363. data/lib/image_paradise/cfdg/rainbow_sun.cfdg +9 -0
  364. data/lib/image_paradise/cfdg/random_handwriting.cfdg +50 -0
  365. data/lib/image_paradise/cfdg/random_tile_shapes_jens_revisited.cfdg +146 -0
  366. data/lib/image_paradise/cfdg/rays_attack.cfdg +29 -0
  367. data/lib/image_paradise/cfdg/razpad.cfdg +20 -0
  368. data/lib/image_paradise/cfdg/rectangular_distortion.cfdg +169 -0
  369. data/lib/image_paradise/cfdg/recurse_path.cfdg +38 -0
  370. data/lib/image_paradise/cfdg/red_flurry.cfdg +64 -0
  371. data/lib/image_paradise/cfdg/red_horse_tail.cfdg +36 -0
  372. data/lib/image_paradise/cfdg/red_yellow_mosaic.cfdg +26 -0
  373. data/lib/image_paradise/cfdg/rendering_tests.cfdg +183 -0
  374. data/lib/image_paradise/cfdg/repeat_floor_tile_pattern.cfdg +153 -0
  375. data/lib/image_paradise/cfdg/repeat_tile.cfdg +160 -0
  376. data/lib/image_paradise/cfdg/retro_disc.cfdg +736 -0
  377. data/lib/image_paradise/cfdg/ring_growth_variation.cfdg +41 -0
  378. data/lib/image_paradise/cfdg/robot_nightlife.cfdg +25 -0
  379. data/lib/image_paradise/cfdg/rolled_firespiral.cfdg +34 -0
  380. data/lib/image_paradise/cfdg/rose.cfdg +44 -0
  381. data/lib/image_paradise/cfdg/round_tree.cfdg +121 -0
  382. data/lib/image_paradise/cfdg/rubiks_cube.cfdg +120 -0
  383. data/lib/image_paradise/cfdg/ruins.cfdg +19 -0
  384. data/lib/image_paradise/cfdg/sails_and_the_sea.cfdg +27 -0
  385. data/lib/image_paradise/cfdg/salt_crystals.cfdg +26 -0
  386. data/lib/image_paradise/cfdg/saturn.cfdg +105 -0
  387. data/lib/image_paradise/cfdg/scary_pot.cfdg +49 -0
  388. data/lib/image_paradise/cfdg/schematic_worm.cfdg +35 -0
  389. data/lib/image_paradise/cfdg/school_script.cfdg +359 -0
  390. data/lib/image_paradise/cfdg/seahorse.cfdg +78 -0
  391. data/lib/image_paradise/cfdg/seasons.cfdg +115 -0
  392. data/lib/image_paradise/cfdg/segmental_veins.cfdg +66 -0
  393. data/lib/image_paradise/cfdg/select_mayhem.cfdg +28 -0
  394. data/lib/image_paradise/cfdg/seven_folded_symmetry.cfdg +7 -0
  395. data/lib/image_paradise/cfdg/several_cats.cfdg +996 -0
  396. data/lib/image_paradise/cfdg/shadow_box.cfdg +49 -0
  397. data/lib/image_paradise/cfdg/shadowrun_google_maps.cfdg +66 -0
  398. data/lib/image_paradise/cfdg/shadowrun_nightline.cfdg +18 -0
  399. data/lib/image_paradise/cfdg/shards.cfdg +70 -0
  400. data/lib/image_paradise/cfdg/sheet_music.cfdg +213 -0
  401. data/lib/image_paradise/cfdg/shy_guy.cfdg +886 -0
  402. data/lib/image_paradise/cfdg/sierpinski1.cfdg +41 -0
  403. data/lib/image_paradise/cfdg/sierpinski2.cfdg +34 -0
  404. data/lib/image_paradise/cfdg/sierpinski_like_red_swirl.cfdg +46 -0
  405. data/lib/image_paradise/cfdg/sierpinsktri.cfdg +9 -0
  406. data/lib/image_paradise/cfdg/silk_flowers.cfdg +68 -0
  407. data/lib/image_paradise/cfdg/silk_scarf.cfdg +18 -0
  408. data/lib/image_paradise/cfdg/simple_cilia.cfdg +88 -0
  409. data/lib/image_paradise/cfdg/simple_circle_and_square.cfdg +7 -0
  410. data/lib/image_paradise/cfdg/simple_coloured_square.cfdg +38 -0
  411. data/lib/image_paradise/cfdg/simple_ferns.cfdg +40 -0
  412. data/lib/image_paradise/cfdg/simple_fish.cfdg +77 -0
  413. data/lib/image_paradise/cfdg/simple_orchid.cfdg +23 -0
  414. data/lib/image_paradise/cfdg/simple_rounded_colour_wheel.cfdg +10 -0
  415. data/lib/image_paradise/cfdg/simple_sheet_music.cfdg +27 -0
  416. data/lib/image_paradise/cfdg/sincos_pattern_2.cfdg +42 -0
  417. data/lib/image_paradise/cfdg/singing_birdy.cfdg +112 -0
  418. data/lib/image_paradise/cfdg/skyscraper.cfdg +85 -0
  419. data/lib/image_paradise/cfdg/small_golden_rectangle.cfdg +12 -0
  420. data/lib/image_paradise/cfdg/smells_like_layered.cfdg +43 -0
  421. data/lib/image_paradise/cfdg/snowflake.cfdg +26 -0
  422. data/lib/image_paradise/cfdg/snowstorm.cfdg +26 -0
  423. data/lib/image_paradise/cfdg/soar_on_wings.cfdg +8 -0
  424. data/lib/image_paradise/cfdg/soft_core.cfdg +26 -0
  425. data/lib/image_paradise/cfdg/soft_touch.cfdg +20 -0
  426. data/lib/image_paradise/cfdg/some_sort_of_tree.cfdg +57 -0
  427. data/lib/image_paradise/cfdg/spade_ball.cfdg +39 -0
  428. data/lib/image_paradise/cfdg/sparks.cfdg +39 -0
  429. data/lib/image_paradise/cfdg/sperm.cfdg +63 -0
  430. data/lib/image_paradise/cfdg/sphinx.cfdg +17 -0
  431. data/lib/image_paradise/cfdg/spiral_clusters.cfdg +29 -0
  432. data/lib/image_paradise/cfdg/spiral_cross.cfdg +27 -0
  433. data/lib/image_paradise/cfdg/spiral_star.cfdg +19 -0
  434. data/lib/image_paradise/cfdg/spiral_sun.cfdg +39 -0
  435. data/lib/image_paradise/cfdg/spirit.cfdg +47 -0
  436. data/lib/image_paradise/cfdg/splatter_tree.cfdg +61 -0
  437. data/lib/image_paradise/cfdg/spliced.cfdg +27 -0
  438. data/lib/image_paradise/cfdg/spring_parade.cfdg +105 -0
  439. data/lib/image_paradise/cfdg/sprinkle_explosion.cfdg +23 -0
  440. data/lib/image_paradise/cfdg/square_limit_one.cfdg +15 -0
  441. data/lib/image_paradise/cfdg/square_rose.cfdg +75 -0
  442. data/lib/image_paradise/cfdg/square_spiral4.cfdg +41 -0
  443. data/lib/image_paradise/cfdg/square_star.cfdg +39 -0
  444. data/lib/image_paradise/cfdg/squiggle.cfdg +54 -0
  445. data/lib/image_paradise/cfdg/stacked_blob.cfdg +27 -0
  446. data/lib/image_paradise/cfdg/star_explosion.cfdg +38 -0
  447. data/lib/image_paradise/cfdg/star_flower.cfdg +72 -0
  448. data/lib/image_paradise/cfdg/star_mosaic_2007.cfdg +51 -0
  449. data/lib/image_paradise/cfdg/starry_pines.cfdg +79 -0
  450. data/lib/image_paradise/cfdg/stars_tentacles.cfdg +28 -0
  451. data/lib/image_paradise/cfdg/starshape.cfdg +57 -0
  452. data/lib/image_paradise/cfdg/strange_antlers.cfdg +49 -0
  453. data/lib/image_paradise/cfdg/strange_carpet.cfdg +13 -0
  454. data/lib/image_paradise/cfdg/sunset_city.cfdg +112 -0
  455. data/lib/image_paradise/cfdg/sweep.cfdg +946 -0
  456. data/lib/image_paradise/cfdg/swimmers_sperms.cfdg +54 -0
  457. data/lib/image_paradise/cfdg/sword.cfdg +24 -0
  458. data/lib/image_paradise/cfdg/tangle.cfdg +25 -0
  459. data/lib/image_paradise/cfdg/tapestry.cfdg +40 -0
  460. data/lib/image_paradise/cfdg/tasty_loops.cfdg +97 -0
  461. data/lib/image_paradise/cfdg/tendril.cfdg +6 -0
  462. data/lib/image_paradise/cfdg/tentacle_tree.cfdg +57 -0
  463. data/lib/image_paradise/cfdg/terraforming.cfdg +87 -0
  464. data/lib/image_paradise/cfdg/test.cfdg +7 -0
  465. data/lib/image_paradise/cfdg/tetris.cfdg +123 -0
  466. data/lib/image_paradise/cfdg/textured_giraffes.cfdg +122 -0
  467. data/lib/image_paradise/cfdg/the_eye.cfdg +16 -0
  468. data/lib/image_paradise/cfdg/the_go_game.cfdg +81 -0
  469. data/lib/image_paradise/cfdg/the_secret.cfdg +52 -0
  470. data/lib/image_paradise/cfdg/the_third_eye.cfdg +42 -0
  471. data/lib/image_paradise/cfdg/thingy.cfdg +13 -0
  472. data/lib/image_paradise/cfdg/thorns.cfdg +26 -0
  473. data/lib/image_paradise/cfdg/too_many_notes.cfdg +155 -0
  474. data/lib/image_paradise/cfdg/top_down_plant_root.cfdg +43 -0
  475. data/lib/image_paradise/cfdg/top_view_tree.cfdg +79 -0
  476. data/lib/image_paradise/cfdg/transparent_heart.cfdg +31 -0
  477. data/lib/image_paradise/cfdg/tree.cfdg +68 -0
  478. data/lib/image_paradise/cfdg/tree_number_5.cfdg +28 -0
  479. data/lib/image_paradise/cfdg/tree_retro.cfdg +46 -0
  480. data/lib/image_paradise/cfdg/tree_spiral.cfdg +52 -0
  481. data/lib/image_paradise/cfdg/treematic.cfdg +42 -0
  482. data/lib/image_paradise/cfdg/tri_arc.cfdg +16 -0
  483. data/lib/image_paradise/cfdg/tri_squares.cfdg +7 -0
  484. data/lib/image_paradise/cfdg/tube_map.cfdg +112 -0
  485. data/lib/image_paradise/cfdg/turing_morphogenesis.cfdg +788 -0
  486. data/lib/image_paradise/cfdg/twisted_hex_grid.cfdg +26 -0
  487. data/lib/image_paradise/cfdg/twisty_triangel.cfdg +79 -0
  488. data/lib/image_paradise/cfdg/twizeeded.cfdg +19 -0
  489. data/lib/image_paradise/cfdg/uncontrolled_fungus.cfdg +36 -0
  490. data/lib/image_paradise/cfdg/underground.cfdg +72 -0
  491. data/lib/image_paradise/cfdg/underwater.cfdg +75 -0
  492. data/lib/image_paradise/cfdg/unicorn_boi.cfdg +20 -0
  493. data/lib/image_paradise/cfdg/unification_sign.cfdg +52 -0
  494. data/lib/image_paradise/cfdg/urban_connections.cfdg +44 -0
  495. data/lib/image_paradise/cfdg/us_flag.cfdg +109 -0
  496. data/lib/image_paradise/cfdg/v_null.cfdg +89 -0
  497. data/lib/image_paradise/cfdg/very_simple_flower.cfdg +45 -0
  498. data/lib/image_paradise/cfdg/very_simple_hexagon.cfdg +16 -0
  499. data/lib/image_paradise/cfdg/very_simple_octagon.cfg +13 -0
  500. data/lib/image_paradise/cfdg/vigorous_vine.cfdg +45 -0
  501. data/lib/image_paradise/cfdg/ville_topview.cfdg +70 -0
  502. data/lib/image_paradise/cfdg/vine.cfdg +176 -0
  503. data/lib/image_paradise/cfdg/vinyl.cfdg +12 -0
  504. data/lib/image_paradise/cfdg/violet_ribbons.cfdg +45 -0
  505. data/lib/image_paradise/cfdg/voronoi_2.cfdg +61 -0
  506. data/lib/image_paradise/cfdg/wald.cfdg +46 -0
  507. data/lib/image_paradise/cfdg/water_ink.cfdg +71 -0
  508. data/lib/image_paradise/cfdg/water_monster.cfdg +33 -0
  509. data/lib/image_paradise/cfdg/web.cfdg +53 -0
  510. data/lib/image_paradise/cfdg/weighting_demo.cfdg +16 -0
  511. data/lib/image_paradise/cfdg/weird_spots.cfdg +15 -0
  512. data/lib/image_paradise/cfdg/welcome.cfdg +109 -0
  513. data/lib/image_paradise/cfdg/where_do_you_want_to_go_today.cfdg +632 -0
  514. data/lib/image_paradise/cfdg/where_is_the_head.cfdg +28 -0
  515. data/lib/image_paradise/cfdg/where_to_go.cfdg +62 -0
  516. data/lib/image_paradise/cfdg/willow.cfdg +39 -0
  517. data/lib/image_paradise/cfdg/witch_poison.cfdg +58 -0
  518. data/lib/image_paradise/cfdg/wooden_floor.cfdg +95 -0
  519. data/lib/image_paradise/cfdg/writhing.cfdg +15 -0
  520. data/lib/image_paradise/cfdg/wrooom_cars.cfdg +124 -0
  521. data/lib/image_paradise/cfdg/xmas_code.cfdg +101 -0
  522. data/lib/image_paradise/cfdg/xmas_tree.cfdg +70 -0
  523. data/lib/image_paradise/cfdg/yellow_cactus.cfdg +52 -0
  524. data/lib/image_paradise/cfdg/yet_another_explosion.cfdg +46 -0
  525. data/lib/image_paradise/cfdg/yin_yang_taijitu_pattern.cfdg +44 -0
  526. data/lib/image_paradise/cfdg/yog.cfdg +27 -0
  527. data/lib/image_paradise/cfdg/yurbanis_m.cfdg +27 -0
  528. data/lib/image_paradise/cfdg/zen_tree.cfdg +79 -0
  529. data/lib/image_paradise/cfdg/ziggy_flowers.cfdg +44 -0
  530. data/lib/image_paradise/cfdg/zodiac.cfdg +43 -0
  531. data/lib/image_paradise/chunky_png/chunky_png.rb +54 -0
  532. data/lib/image_paradise/colours/colours.rb +55 -0
  533. data/lib/image_paradise/confree_generator/confree_generator.rb +793 -0
  534. data/lib/image_paradise/confree_generator/constants.rb +93 -0
  535. data/lib/image_paradise/constants/constants.rb +50 -0
  536. data/lib/image_paradise/constants/image_file_types.rb +27 -0
  537. data/lib/image_paradise/crop/crop.rb +429 -0
  538. data/lib/image_paradise/gm_support.rb +34 -0
  539. data/lib/image_paradise/graphs/accumulator_bar.rb +29 -0
  540. data/lib/image_paradise/graphs/area.rb +64 -0
  541. data/lib/image_paradise/graphs/bar.rb +117 -0
  542. data/lib/image_paradise/graphs/bar_conversion.rb +53 -0
  543. data/lib/image_paradise/graphs/base.rb +1392 -0
  544. data/lib/image_paradise/graphs/bezier.rb +45 -0
  545. data/lib/image_paradise/graphs/bullet.rb +115 -0
  546. data/lib/image_paradise/graphs/deprecated.rb +42 -0
  547. data/lib/image_paradise/graphs/dot.rb +129 -0
  548. data/lib/image_paradise/graphs/line.rb +328 -0
  549. data/lib/image_paradise/graphs/mini/bar.rb +42 -0
  550. data/lib/image_paradise/graphs/mini/legend.rb +109 -0
  551. data/lib/image_paradise/graphs/mini/pie.rb +42 -0
  552. data/lib/image_paradise/graphs/mini/side_bar.rb +41 -0
  553. data/lib/image_paradise/graphs/net.rb +133 -0
  554. data/lib/image_paradise/graphs/photo_bar.rb +106 -0
  555. data/lib/image_paradise/graphs/pie.rb +139 -0
  556. data/lib/image_paradise/graphs/scatter.rb +264 -0
  557. data/lib/image_paradise/graphs/scene.rb +216 -0
  558. data/lib/image_paradise/graphs/side_bar.rb +144 -0
  559. data/lib/image_paradise/graphs/side_stacked_bar.rb +116 -0
  560. data/lib/image_paradise/graphs/spider.rb +163 -0
  561. data/lib/image_paradise/graphs/stacked_area.rb +73 -0
  562. data/lib/image_paradise/graphs/stacked_bar.rb +68 -0
  563. data/lib/image_paradise/graphs/stacked_mixin.rb +30 -0
  564. data/lib/image_paradise/graphs/themes.rb +117 -0
  565. data/lib/image_paradise/graphs.rb +36 -0
  566. data/lib/image_paradise/graphviz/README.md +2 -0
  567. data/lib/image_paradise/graphviz/generate_graphviz_image.rb +276 -0
  568. data/lib/image_paradise/gui/gtk3/cfdg_widget/cfdg_widget.rb +1452 -0
  569. data/lib/image_paradise/gui/gtk3/cfdg_widget/connect_skeleton.rb +46 -0
  570. data/lib/image_paradise/gui/gtk3/image_editor/connect_skeleton.rb +126 -0
  571. data/lib/image_paradise/gui/gtk3/image_editor/image_editor.rb +2003 -0
  572. data/lib/image_paradise/identify.rb +184 -0
  573. data/lib/image_paradise/image_paradise.rb +153 -0
  574. data/lib/image_paradise/image_to_ascii/image_to_ascii.rb +187 -0
  575. data/lib/image_paradise/image_to_pdf/image_to_pdf.rb +99 -0
  576. data/lib/image_paradise/label/README.md +2 -0
  577. data/lib/image_paradise/label/simple_label.rb +206 -0
  578. data/lib/image_paradise/logo/IMGUR_LOGO.png +0 -0
  579. data/lib/image_paradise/project/project.rb +30 -0
  580. data/lib/image_paradise/requires/common_base_requires.rb +17 -0
  581. data/lib/image_paradise/requires/require_colours.rb +9 -0
  582. data/lib/image_paradise/requires/require_gtk_components.rb +8 -0
  583. data/lib/image_paradise/requires/require_image_to_ascii.rb +7 -0
  584. data/lib/image_paradise/requires/require_the_image_paradise_project.rb +42 -0
  585. data/lib/image_paradise/requires/require_toplevel_methods.rb +21 -0
  586. data/lib/image_paradise/rotate/README.md +2 -0
  587. data/lib/image_paradise/rotate/rotate.rb +124 -0
  588. data/lib/image_paradise/shell/interactive.rb +156 -0
  589. data/lib/image_paradise/svg/README.md +5 -0
  590. data/lib/image_paradise/svg/circle.rb +106 -0
  591. data/lib/image_paradise/svg/feature.rb +48 -0
  592. data/lib/image_paradise/svg/rectangle.rb +154 -0
  593. data/lib/image_paradise/svg/svg.rb +102 -0
  594. data/lib/image_paradise/toplevel_methods/add_black_border_to_this_image.rb +94 -0
  595. data/lib/image_paradise/toplevel_methods/create_animated_gif.rb +49 -0
  596. data/lib/image_paradise/toplevel_methods/crop.rb +29 -0
  597. data/lib/image_paradise/toplevel_methods/e.rb +16 -0
  598. data/lib/image_paradise/toplevel_methods/esystem.rb +19 -0
  599. data/lib/image_paradise/toplevel_methods/extract_text_from_this_image.rb +56 -0
  600. data/lib/image_paradise/toplevel_methods/file_related_code.rb +110 -0
  601. data/lib/image_paradise/toplevel_methods/flip_image_left_right.rb +59 -0
  602. data/lib/image_paradise/toplevel_methods/font_related_methods.rb +62 -0
  603. data/lib/image_paradise/toplevel_methods/greyscale_this_image.rb +76 -0
  604. data/lib/image_paradise/toplevel_methods/gui.rb +19 -0
  605. data/lib/image_paradise/toplevel_methods/help.rb +30 -0
  606. data/lib/image_paradise/toplevel_methods/interlace.rb +33 -0
  607. data/lib/image_paradise/toplevel_methods/is_an_image_file.rb +18 -0
  608. data/lib/image_paradise/toplevel_methods/make_this_image_transparent.rb +40 -0
  609. data/lib/image_paradise/toplevel_methods/menu.rb +110 -0
  610. data/lib/image_paradise/toplevel_methods/merge_these_images.rb +49 -0
  611. data/lib/image_paradise/toplevel_methods/mirror_image.rb +28 -0
  612. data/lib/image_paradise/toplevel_methods/misc.rb +1603 -0
  613. data/lib/image_paradise/toplevel_methods/negate.rb +36 -0
  614. data/lib/image_paradise/toplevel_methods/png_to_svg.rb +38 -0
  615. data/lib/image_paradise/toplevel_methods/quality.rb +34 -0
  616. data/lib/image_paradise/toplevel_methods/resized.rb +43 -0
  617. data/lib/image_paradise/toplevel_methods/roebe.rb +440 -0
  618. data/lib/image_paradise/toplevel_methods/thumbnail.rb +54 -0
  619. data/lib/image_paradise/toplevel_methods/to_png.rb +106 -0
  620. data/lib/image_paradise/toplevel_methods/wallpaper.rb +51 -0
  621. data/lib/image_paradise/toplevel_methods/write_this_text.rb +89 -0
  622. data/lib/image_paradise/utility_scripts/black_white.rb +92 -0
  623. data/lib/image_paradise/utility_scripts/create_new_image.rb +110 -0
  624. data/lib/image_paradise/utility_scripts/image_border.rb +226 -0
  625. data/lib/image_paradise/utility_scripts/image_gallery/image_gallery.rb +305 -0
  626. data/lib/image_paradise/utility_scripts/image_manipulations.rb +316 -0
  627. data/lib/image_paradise/utility_scripts/magic_card_border.rb +215 -0
  628. data/lib/image_paradise/utility_scripts/optimizer.rb +444 -0
  629. data/lib/image_paradise/utility_scripts/random_text_to_image.rb +364 -0
  630. data/lib/image_paradise/utility_scripts/text_on_image.rb +311 -0
  631. data/lib/image_paradise/utility_scripts/to_gif.rb +93 -0
  632. data/lib/image_paradise/utility_scripts/to_jpg.rb +82 -0
  633. data/lib/image_paradise/version/version.rb +19 -0
  634. data/lib/image_paradise/www/cfdg.cgi +25 -0
  635. data/lib/image_paradise/www/imagemagick/imagemagick.cgi +266 -0
  636. data/lib/image_paradise/yaml/README.md +2 -0
  637. data/lib/image_paradise/yaml/arc.yml +0 -0
  638. data/lib/image_paradise/yaml/circle.yml +6 -0
  639. data/lib/image_paradise/yaml/rectangle.yml +6 -0
  640. data/lib/image_paradise.rb +5 -0
  641. data/test/16x16_red_square_image_for_testing.png +0 -0
  642. data/test/misc/README.md +3 -0
  643. data/test/misc/testing_filling_up_with_circles.rb +65 -0
  644. data/test/testing_confree_generator.rb +8 -0
  645. data/test/testing_crop.rb +19 -0
  646. data/test/testing_image_magick_commands.rb +39 -0
  647. data/test/testing_image_paradise.rb +49 -0
  648. data/test/testing_the_svg_component.html +261 -0
  649. data/test/testing_the_svg_component.rb +106 -0
  650. metadata +762 -0
data/README.md ADDED
@@ -0,0 +1,1015 @@
1
+ [![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://www.gobolinux.org/)
2
+ [![forthebadge](https://forthebadge.com/images/badges/made-with-ruby.svg)](https://www.ruby-lang.org/en/)
3
+ [![Gem Version](https://badge.fury.io/rb/image_paradise.svg)](https://badge.fury.io/rb/image_paradise)
4
+
5
+ This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">18.11.2023</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">08:22:30</span> o'clock.
6
+
7
+ <img src="https://i.imgur.com/FqAgAbm.png" style="margin: 0.8em; margin-left: 3em">
8
+
9
+ (This image was partially autogenerated via cfdg. You can re-use
10
+ this image and modify it if you wish to without restrictions.
11
+ For the actual .cfdg code, please have a look at the gallery
12
+ there: https://www.contextfreeart.org/gallery/)
13
+
14
+ ## How to install this project
15
+
16
+ The obvious way is to do this:
17
+
18
+ gem install image_paradise
19
+
20
+ However had, installing into the user directory may be
21
+ more useful, depending on your use case:
22
+
23
+ gem install image_paradise --user-install
24
+
25
+ The latter may be a bit better, as it should be easier to get
26
+ this installed into the home directory.
27
+
28
+ Then you can symlink bin/image_paradise to $PATH or any other
29
+ name as-is. Or just start irb, require 'image_paradise', and
30
+ call whatever class you need there. You could even do so
31
+ for the ruby-gtk3 bindings, if you have these installed,
32
+ and the gtk_paradise gem.
33
+
34
+ Example for this:
35
+
36
+ require 'image_paradise'
37
+ ImageParadise.confree_GUI # Start the gtk-confree GUI.
38
+
39
+ For an explanation of the --user-install option see the
40
+ article here:
41
+
42
+ https://guides.rubygems.org/faqs/#i-installed-gems-with---user-install-and-their-commands-are-not-available
43
+
44
+ ## Flip-flopping an image from left-to-right
45
+
46
+ If you want to flip an image left-to-right, you can use
47
+ the method <b>.flip_image_left_right</b>. The file resides
48
+ at <b>image_paradise/toplevel_methods/flip_image_left_right.rb</b>.
49
+
50
+ Example:
51
+
52
+ require 'image_paradise/toplevel_methods/flip_image_left_right.rb'
53
+ ImageParadise.flip_image_left_right() # Pass the file path to this method.
54
+
55
+ ## Transparent images
56
+
57
+ You can use this API to make an image **transparent**:
58
+
59
+ require 'image_paradise/toplevel_methods/make_this_image_transparent.rb'
60
+ ImageParadise.make_this_image_transparent
61
+ ImageParadise.make_this_image_transparent('foobar.jpg')
62
+
63
+ This will try to make use of ImageMagick's **convert** ability.
64
+
65
+ ## Negating an image
66
+
67
+ You can negate an image, aka the "flipped" colour state, via:
68
+
69
+ require 'image_paradise/toplevel_methods/negate.rb'
70
+ ImageParadise.negate()
71
+ ImageParadise.negate('filename_here.jpg')
72
+
73
+ If you negate such an image again, you will have the original
74
+ image back.
75
+
76
+ ## Merging image files together
77
+
78
+ You can use the toplevel method **ImageParadise.merge_these_images**
79
+ in order to merge several image files together. This depends on the
80
+ binary called **convert**, from ImageMagick. Note that this will
81
+ merge from the left-to-the-right side, and use white background
82
+ by default if an image has to be padded. The biggest image will
83
+ determine the amount that has to be padded here.
84
+
85
+ As first argument simply pass an Array of the files that you wish
86
+ to merge, such as:
87
+
88
+ ImageParadise.merge_these_images(%w( foo.png bar.png bla.png ))
89
+ ImageParadise.merge(%w( foo.png bar.png bla.png )) # <- This also works.
90
+
91
+ ## Greyscaling images
92
+
93
+ You can grayscale images via:
94
+
95
+ ImageParadise.greyscale_this_image()
96
+ ImageParadise.grayscale_this_image()
97
+
98
+ This currently (Jan 2019) depends on the gem called **mini_magick**. In
99
+ the future we may add some more flexibility to this method, but for the
100
+ time being mini_magick is a dependency if you wish to make use of
101
+ these **toplevel methods**.
102
+
103
+ Greyscaling an image may be useful if you wish to use this for
104
+ **optical character recognition**, aka recognising written text
105
+ on it.
106
+
107
+ ## class ImageParadiseImageToAscii
108
+
109
+ This class can convert images to ASCII files, if ImageMagick
110
+ (and the rmagick bindings) are available.
111
+
112
+ To specifically require this class, do this:
113
+
114
+ require 'image_paradise/requires/require_image_to_ascii.rb'
115
+
116
+ Then pass the filename into the class:
117
+
118
+ result = ImageParadise::ImageToAscii['foobar.jpg']
119
+ result = ImageParadise.image_to_ascii('foobar.jpg')
120
+
121
+ or
122
+
123
+ _ = ImageParadise::ImageToAscii.new '/foo/bar.png'
124
+ _.to_ascii # Generate the ascii "image" here specifically, via this method call.
125
+
126
+ or
127
+
128
+ print ImageParadise::ImageToAscii('yo.png').to_ascii(width: 50)
129
+
130
+ +--------------------------------------------------+
131
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
132
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
133
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
134
+ |oooooooooooooooooo===++++====ooooooooooooooooooooo|
135
+ |ooooooooooooo=+:~.~........~~~:+=ooooooooooooooooo|
136
+ |oooooooooo==:~...~~:++++++:~~..~~:+=oooooooooooooo|
137
+ |oooooooo=+:...~++====oooo====+:~..~:+=oooooooooooo|
138
+ |ooooooo=+~..~:++==ooooooooooo=++:~..~+=ooooooooooo|
139
+ |oooooo=+~.~:+=+~.~~~~~~~~:~~~.~:++:~.~+=oooooooooo|
140
+ |ooooo=+~~.+===~................~+==:.~~+=ooooooooo|
141
+ |ooooo=:~~:+=+:~................~~+=+:~.:=ooooooooo|
142
+ |ooooo=~.~+==+~.......XXXXX.......+==+~.:=ooooooooo|
143
+ |ooooo=~~~+==:~.......XXXXX.......:==+~.:=ooooooooo|
144
+ |ooooo=~~~:==+~.......XXXXX......~+==+~.~=ooooooooo|
145
+ |ooooo=:~~~+=++~.................:+=+~~~:=ooooooooo|
146
+ |ooooo=+:..~+==+~~...........~~~+==+~..:+=ooooooooo|
147
+ |ooooooo+:..~:+=o=+:........:+====:~.~:==oooooooooo|
148
+ |oooooooo=+~.~~:+==+~......~+==+:~..~:+oooooooooooo|
149
+ |ooooooooo=+:~..~~:~~.......~:~~..~:+oooooooooooooo|
150
+ |oooooooooooo=+~~..............~:+=oooooooooooooooo|
151
+ |ooooooooooooooo==++:~~~~~~:++==ooooooooooooooooooo|
152
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
153
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
154
+ |oooooooooooooooooooooooooooooooooooooooooooooooooo|
155
+ +--------------------------------------------------+
156
+
157
+ Add colours via the "colour" option
158
+
159
+ require 'image_paradise'
160
+ a = ImageParadise::ImageToAscii.new "http://www.evangogh.org/images/paintings/self-portrait.jpg"
161
+ puts a.to_ascii(color: true)
162
+
163
+ Command Line examples:
164
+
165
+ image_to_ascii ~/Desktop/foo.png # Local file.
166
+ image_to_ascii http://www.google.com/images/foo.png # Remote image.
167
+ image_to_ascii -c -f html ~/foobar.jpg > ~/Desktop/ascii-as-html.html # Output via HTML.
168
+ image_to_ascii -w 50 -c -f html ~/foo/bar.jpg > ~/Desktop/saturdaynight.html # Or smaller.
169
+
170
+ To display help:
171
+
172
+ image_to_ascii -h
173
+
174
+ Usage: image_to_ascii [options] <path_or_url>
175
+ -w, --width WIDTH Width of the finished Ascii Image (Default: 150)
176
+ -f, --format [text/html] output format (Default: text)
177
+ -c, --color Switch to use colored terminal output (Default: false)
178
+ -i, --invert-chars Invert the character map. *Depending on background and image color - this can make the result clearer.*
179
+ -v, --version Show the version of this project
180
+ -h, --help Show this message
181
+
182
+ ## SVG
183
+
184
+ ImageParadise now has a submodule called **Svg**, for svg-related
185
+ objects. Documentation is currently missing for this part. Hopefully
186
+ I will have more time in the future to add the missing
187
+ documentation here. :\
188
+
189
+ ## ImageMagick versus GraphicsMagick
190
+
191
+ GraphicsMagick is a fork of ImageMagick, started in the year 2002.
192
+
193
+ I do not know the real differences between these two projects. For now,
194
+ the **image_paradise** gem will focus on ImageMagick first. Perhaps at
195
+ a later time I may add support for GraphicsMagick, but I want to
196
+ finish the GUI components first, before looking for more flexibility
197
+ after that.
198
+
199
+ ## Create background images and wallpapers
200
+
201
+ To create a white wallpaper, use this API:
202
+
203
+ ImageParadise.white_wallpaper
204
+ ImageParadise.white_wallpaper(width = :default, height = :default)
205
+ ImageParadise.white_wallpaper(1200, 800)
206
+
207
+ This makes use of a more general API called:
208
+
209
+ ImageParadise.wallpaper()
210
+
211
+ The first argument is the colour for that background image. The default
212
+ colour here will be black, hence a black background image.
213
+
214
+ ## cfdg
215
+
216
+ The **image_paradise** gem includes code that allows the user to
217
+ batch-generate images from **.cfdg** files, making use of the
218
+ cfdg binary (**context free design**).
219
+
220
+ You can download **cfdg** from:
221
+
222
+ https://www.contextfreeart.org/downloads.html
223
+
224
+ I typically compile the variant from source directly.
225
+
226
+ My long-term goal in this regard, as far as the **image_paradise**
227
+ gem is concerned, is to **use a commandline variant**, as well as
228
+ a GUI wrapper for this. The GUI will be written in **ruby-gtk3**.
229
+ Perhaps www-bindings via sinatra may also be offered one day, via
230
+ the ImageParadise project - let's see.
231
+
232
+ Additionally, the image_paradise .gem will include many .cfdg
233
+ example files, written by many different people (mostly; I wrote
234
+ a few .cfdg files as well but not many). The filename of all these
235
+ .cfdg files **must** be downcased - I mention this because some
236
+ of the upstream .cfdg files have upcased characters, which annoys
237
+ me. Keep it simple, folks!
238
+
239
+ Some of these files are **+16 years old** and have to be updated
240
+ really, but you know how it is when time is a limited resource. So
241
+ the rules that govern some of these .cfdg files is ... a bit
242
+ outdated.
243
+
244
+ I'll also have to add URLs to some of these ancient .cfdg files,
245
+ author-information and so forth; this is low priority for now,
246
+ though. It's mostly clean up work, which isn't as much fun
247
+ to do. :-)
248
+
249
+ To start the **ruby-gtk3** bindings, depending on the gtk_paradise
250
+ gem, you can try this from the commandline:
251
+
252
+ confree_generator --gui
253
+
254
+ The following image shows how this may look in **December 2021** -
255
+ in the long run I intend to improve this GUI, but for now the
256
+ most important part is to finish the desired functionality. I'd
257
+ love to have a full editor for CFDG one day:
258
+
259
+ <img src="https://i.imgur.com/yNyt0He.png" style="margin: 1em; margin-left: 3em">
260
+
261
+ Todo list for the ruby-gtk3 wrapper:
262
+
263
+ - On middle-mouse scroll-wheel scroll-event, change the number of
264
+ the gtk-entry there, e. g. upwards scrolling means
265
+ larger width, down-scroll means smaller width respectively.
266
+
267
+ Existing features and functionality for the ruby-gtk3 wrapper
268
+ over the cfdg binary:
269
+
270
+ - Show all existing local .cfdg files via a button that can
271
+ be clicked. Upon clicking that button, the file is loaded,
272
+ and then a new image is created from this via cfdg. This
273
+ has been implemented in **March 2021**.
274
+
275
+ - Upload to imgur via an image-event-button (the old
276
+ upload-to-imageshack is no longer available, but perhaps it
277
+ may be re-added in the future)
278
+
279
+ In <b>September 2022</b> the widget was rewritten and looks a bit
280
+ better now:
281
+
282
+ <img src="https://i.imgur.com/9Qv4w5H.png" style="margin: 1em; margin-left: 3em">
283
+
284
+ As for .cfdg files distributed as part of the image_paradise gem,
285
+ I try to adhere to this specification in the long run:
286
+
287
+ - The file name should be noted near the very top of the file.
288
+ - All .cfdg file names must be lowercased at all times, so no
289
+ files called <b>foo_BAR.cfdg</b>.
290
+ - If they were obtained from the www, a hyperlink should
291
+ exist within the file, pointing to that original .cfdg
292
+ file. In this case the author should be mentioned as well,
293
+ and the creation date and addition date added too.
294
+
295
+ ## ImageParadise::Identify
296
+
297
+ If you need meta-data about an image then class ImageParadise::Identify
298
+ may be of help. Internally it is just a wrapper over ImageMagick's
299
+ identify functionality, but the key idea is to provide an OOP query
300
+ to these features (when they seem relevant), and use that abstraction
301
+ for other classes to make use of.
302
+
303
+ This class has to remain flexible, because I intend to keep it as
304
+ a base-class for whenever I need information about an image
305
+ programmatically.
306
+
307
+ ## cfdg cheat sheet
308
+
309
+ I am forgetting specifications used in cfdg, and I can not always
310
+ find them when I want to look them up. So I decided to also add
311
+ a few hints here; mostly for my own use case, but perhaps it may
312
+ also help other folks learn cfdg more quickly.
313
+
314
+ # Transparent background:
315
+ background { a -1 }
316
+
317
+ # Rotate a shape:
318
+ r 5 # rotate by +5 %
319
+
320
+ ## Adding a comment to an image file, via metadata
321
+
322
+ **ImageMagick** allows you to add a comment to an image file.
323
+
324
+ The ImageParadise gem added support for this as well,
325
+ just as a wrapper over Imagemagick.
326
+
327
+ API use:
328
+
329
+ ImageParadise.add_this_comment_to_that_image()
330
+ ImageParadise.add_this_comment_to_that_image('This is the comment')
331
+ ImageParadise.add_this_comment_to_that_image('This is the comment','existing_file.png')
332
+
333
+ ## ImageMagick tricks
334
+
335
+ This subsection just is a little random trick-collection.
336
+
337
+ To decrypt a .pdf document and extract the images, use
338
+ the authenticate command-line option:
339
+
340
+ convert -authenticate password input.pdf output%d.png
341
+
342
+ ## Morphing two images together
343
+
344
+ You can morph two images together via ImageMagick.
345
+
346
+ ImageParadise makes this available via this API:
347
+
348
+ ImageParadise.morph_these_images
349
+ ImageParadise.morph_these_images('foo.png','bar.png')
350
+ ImageParadise.morph_these_images('foo.png','bar.png','output_file.png)
351
+
352
+ Pass in the two images; the third argument may be the filename that
353
+ you wish to use for the output-file.
354
+
355
+ ## Graphical User Interface for the ImageParadise project (GUI)
356
+
357
+ Since as of February 2021 I am slowly working on a set of ruby-gtk3
358
+ code that integrates the functionality detailed above. Note that I
359
+ will only add support in the GUI **if** I also have documented - or
360
+ will document - the commandline behaviour shown above. The reason
361
+ as to why is that I want to sync commandline and GUI, but the
362
+ commandline is the main driver, whereas the GUI is merely a reflection
363
+ of the commandline tools of this project.
364
+
365
+ This should help keep things up-to-date, as more changes come at a
366
+ later time. The GUI bindings will not replace something like GIMP,
367
+ for instance.
368
+
369
+ The gtk-widget here will operate on images via an "image-chain".
370
+ This is simply an array of images that are stored subsequently.
371
+ It's not as elegant as real layers and undo-operations in, say,
372
+ GIMP, but it is easy to implement and work-with. See the **undo**
373
+ button for an example of this.
374
+
375
+ To start the ruby-gtk3 bindings, try:
376
+
377
+ image_paradise --gui
378
+
379
+ image_paradise --gtk # or this variant
380
+ image_paradise --gtk3 # or this variant; this will start the gtk-cfdg widget actually
381
+ image_paradise --gtk-image # or this variant
382
+
383
+ Note that in **February 2022** the ruby-gtk2 bindings of the
384
+ gkt-image widget were removed. Perhaps at a later time they
385
+ may be re-added, but for the time being I focus solely on
386
+ ruby-gtk3 instead.
387
+
388
+ Which features are available?
389
+
390
+ Well, as explained above, only features are made available via
391
+ the GUI that are documented here on this page.
392
+
393
+ So far the following features have been implemented via
394
+ the ruby-gtk3 bindings and ImageMagick (March 2021):
395
+
396
+ - Flip horizontally
397
+ - Greyscale the image
398
+ - Add a coloured border around an image
399
+ - Negate the image (180° colour-flip)
400
+ - Resize the image
401
+ - Apply a **gaussian blur** onto the image
402
+ - Add a roundish-circle as the main center view onto the main image
403
+ - Draw text onto the image (currently limited, only one font; will
404
+ have to add support for more fonts there)
405
+ - Basic shape drawing: drawing a line is possible. Drawing a rectangle
406
+ is possible.
407
+ - Crop the image (currently only via gtk-entries, but one day
408
+ we should be able to overlay a crop-mask to calculate the
409
+ crop area properly)
410
+ - Upon pressing the middle-mouse-button on the gtk-entry displaying
411
+ the colour in use for the border, randomly assign a new
412
+ colour from the available HTML colours
413
+ - Able to create a new image (currently background is white)
414
+
415
+ Todo List:
416
+
417
+ - The drawing lines and rectangle should occur on a new image,
418
+ rather than this creates a new image as it currently does.
419
+ - Show info-box displaying information about the current image,
420
+ ideally on the right-hand side. This should include size, and
421
+ perhaps additional information about the image-type as well,
422
+ alpha value and so forth. This has been partially added; needs
423
+ more information still and be made prettier as well.
424
+ - Provide an "undo" button (can be lazy, aka store incomplete images)
425
+ - Add a file-open button. Probably place it on the right side somewhere.
426
+ - Add colour-gradients.
427
+ - Add filters.
428
+ - Add de-novo creation of images; possibly via a small widget
429
+ that allows us to do so. That could be a separate widget
430
+ that can then be integrated into the parent widget.
431
+
432
+ - Add way to query the x and y position accurately on a mouse-button
433
+ event, for the main image.
434
+ - Add a resizable pane widget to the bottom area of the
435
+ main image so that the user can change the size.
436
+
437
+ - Basic shape drawing: we need to be able to combine it into the
438
+ currently loading image, aka "draw on screen" as-is.
439
+
440
+ - Upon mouse-scroll-wheel press-events on the entry with the
441
+ percentage value, change accordingly up or down, so that the
442
+ user may just use the mouse for changes.
443
+
444
+ - Basic shape drawing: we need to add the remaining functionality
445
+ such as drawing a circle, a line and what not.
446
+
447
+ - Add a direct way for the user to do a resize operation.
448
+ Perhaps a general input-entry that gets highlighted or
449
+ something.
450
+ The idea is to support this:
451
+
452
+ convert -resize 42x148 input.jpg output.jpg
453
+
454
+ But to not have the user enter the output name (or perhaps
455
+ still do hmm).
456
+
457
+ - Add a way to specify which lines are to be drawn via a
458
+ script. That way we can use it to automatically draw or
459
+ re-draw specific images as-is. The idea would be that we
460
+ could programmatically generate any image possible, but
461
+ this will probably require changes to the commandline
462
+ version first, before expanding this onto the GUI.
463
+
464
+ ## Blur effects via ImageParadise.blur()
465
+
466
+ You can use the following API for blur-effects:
467
+
468
+ ImageParadise.blur
469
+ ImageParadise.blur('foo.png')
470
+ ImageParadise.blur('foo.png', 5)
471
+ ImageParadise.blur('foo.png', 50)
472
+
473
+ These will modify an image, aka **blur** it. The second argument
474
+ is the radius for the blur operation to use. This functionality
475
+ depends on ImageMagick being installed on the host computer
476
+ system in use.
477
+
478
+ ## Changing the quality of an image
479
+
480
+ Via **ImageMagick** you can use this command to change the quality
481
+ of an image:
482
+
483
+ convert -quality 10% input.jpg output.jpg
484
+
485
+ Via ruby and the image_paradise project, you can use this API:
486
+
487
+ ImageParadise.quality('input.jpg',10,'output.jpg'
488
+
489
+ Be careful when you have .jpg files; from experience I see **a
490
+ lot of deterioration** in regards to quality if you have to do
491
+ many operations again and again. In this case, you may be
492
+ better off converting into .png, then modifying the .png,
493
+ before then converting it back into .jpg again. Note that
494
+ this also causes loss in quality usually, but you have only
495
+ two conversion steps, whereas if you, say, have to do 10
496
+ operations on the .jpg, drawing stuff on the canvas, this
497
+ may lead to worse image quality if you started with a .jpg
498
+ file and keep on working with it.
499
+
500
+ Even a one-time saving to .jpg may impact its quality
501
+ negatively, depending on the chosen quality. As a rule of
502
+ thumb, if I want to maintain some useful quality in a
503
+ given image, I don't go below the 84% quality threshold
504
+ for .jpg files. In the long run, though, I will probably
505
+ switch to a better format when it comes to lossy
506
+ encoding, perhaps WebP - we'll see.
507
+
508
+ ## Rotating an image
509
+
510
+ (Technically this is similar to flip-flop, but I added this functionality
511
+ at a later point, so the flip-flop subsection here shall remain for the
512
+ time being.)
513
+
514
+ The commandline API for rotating an image called **FOOBAR.png**, in
515
+ regards to image_paradise, may go so:
516
+
517
+ imgparadise FOOBAR.png --rotate=33%
518
+ imgparadise foo.png --rotate=90%
519
+ imgparadise *.png --rotate=90%
520
+
521
+ Simply pass the rotation-value that you wish to use into --rotate.
522
+
523
+ Be careful, though - this command will overwrite the image, so **make
524
+ sure to backup your old image** before applying this command.
525
+
526
+ Sometimes you may dislike the background colour used, after having
527
+ applied a rotate-effect. In this case, recall that you can specify
528
+ the background color via **-background red** or another name.
529
+ (This may be integrated into the ruby-gtk3 wrapper, but it is
530
+ currently, in May 2021, not added.)
531
+
532
+ ## The difference between the fill colour and the stroke colour
533
+
534
+ <b>Fill colour</b>:
535
+
536
+ - It fills objects with that colour. So a fill colour of red,
537
+ will paint the object's content, such as a circle in red too.
538
+ You thus get a red circle.
539
+
540
+ <b>Stroke colour</b>:
541
+
542
+ - This colour draws the outline of an object. In other words,
543
+ it will specify a border.
544
+
545
+ ## Table of some ImageMagick commands
546
+
547
+ I did not want to google all the time, so here is just a short
548
+ memo for me which options exist in ImageMagick. This is currently
549
+ very incomplete; in the future I may extend this list.
550
+
551
+ -pointsize 24 # specify the width of the drawling
552
+ -stroke red # use red as the colour for the paint-stroke to be done
553
+ -fill red # this is the fill colour, aka the content of an object
554
+ -strokewidth 3 # set the width, in px, of the paint-stroke action
555
+ -linewidth 5 # the width of the line, when drawing a line
556
+ -font Arbuckle.ttf # use this font; you can specify a local file path too, to a .ttf file
557
+ -annotate 45x0+10+30 # Annotate via 45° angle
558
+
559
+ Because I may re-use the -font option in particular, here is a variant
560
+ that I use:
561
+
562
+ convert -pointsize 24 -font /home/x/src/fonts/Hack-Regular.ttf -stroke red -fill red -annotate 0x0+10+30 testing.com /Depot/NJOY/WaterGirl.png output.png
563
+
564
+ ImageMagick itself supports at the very least **TrueType fonts**,
565
+ **PostScript** and **OPTION1** fonts.
566
+
567
+ ## Borders
568
+
569
+ This subsection explains some general stuff about borders. In this
570
+ context a **border** means an area around an image, such as a
571
+ black border around an image that has a width of 3 pixels (px).
572
+
573
+ You can add some borders to images thanks to **ImageMagick**. The
574
+ **image_paradise** gem supports this as well, to some extent.
575
+
576
+ The toplevel method **ImageParadise.add_black_border_to_this_image()**
577
+ can be used to add a black border to an image. It is a very simple
578
+ method. The first argument to this method is the path to the image
579
+ at hand. The second argument specifies the size of the border,
580
+ in **pixels**. So, if you pass the number **3** as second argument
581
+ then this would mean to draw a border 3 pixel wide around the
582
+ image at hand.
583
+
584
+ Invocation example for the local image file called **foobar.png**
585
+ follows next - adapt this to your own needs as-is:
586
+
587
+ require 'image_paradise/toplevel_methods/add_black_border_to_this_image.rb'
588
+ ImageParadise.add_black_border_to_this_image('foobar.png', 3) # we want the border to have 3 pixels
589
+
590
+ Obviously for this to work, the file must exist locally.
591
+
592
+ It is also possible to add a rounded black border. This can be
593
+ seen in traditional card games, such as **magic the gathering**.
594
+
595
+ If you want to use that, consider making use of the following
596
+ class/file and API:
597
+
598
+ require 'image_paradise/utility_scripts/magic_card_border.rb'
599
+ ImageParadise.:MagicCardBorder.new(ARGV)
600
+ # such as in:
601
+ # ImageParadise.:MagicCardBorder.new('foobar.png')
602
+
603
+ See the --help options for what the class will support.
604
+
605
+ You can alias it to e. g. **magic-rounded** and then
606
+ invoke it via:
607
+
608
+ magic-rounded --size=5
609
+ magic-rounded --size=5 foobar.png
610
+ magic-rounded --size=12 foobar.png
611
+ magic-rounded --size=25 foobar.png
612
+
613
+ The --size parameter determines which size to use, via
614
+ the commandline. I recommend keeping the --size parameter
615
+ fairly small; more than **--size=12** is rarely necessary,
616
+ in my opinion. Better to have a slight black border than
617
+ a huge one - but, either way, this is entirely up to the
618
+ user.
619
+
620
+ ## Some toplevel methods explained
621
+
622
+ The method **ImageParadise.default_colour?** will give back
623
+ the default colour for the project, if it has been assigned.
624
+ I needed this because some image-related operations require
625
+ a colour, and being able to omit this for subsequent use
626
+ can be convenient, aka set the colour once, and then
627
+ continue to work from there.
628
+
629
+ ## API consideration
630
+
631
+ This subsection shows a few syntax examples how I plan to
632
+ rewrite the project in **2022**.
633
+
634
+ Write the text "Hello world" on the image **FOOBAR.png**:
635
+
636
+ textonimage FOOBAR.png --text="Hello world" --colour=darkgreen --font-size=22 --position=3,4
637
+
638
+ This will be passed to class **ImageParadise::TextOnImage**,
639
+ where **ipa** is an alias I use towards
640
+ **bin/image_paradise**. I intend to improve this
641
+ class over the coming weeks.
642
+
643
+ An even simpler variant follows for a closely related
644
+ script, at **bin/img_text**:
645
+
646
+ imgtext what the heck some_file.png --darkblue
647
+ imgtext what the heck some_file.png --tomato # you can pass HTML colours here
648
+
649
+ Why is the example shown above via **imgtext** nice to have?
650
+
651
+ Well - the idea here is that you first think what kind of
652
+ text you want to display on the image. Then, you pass the
653
+ image filename, such as foobar.png. And then you append
654
+ extra commandline flags via -- such as --darkblue.
655
+
656
+ It may be hard to explain why this is useful, but just give
657
+ it a try on some existing image, and play around a bit with
658
+ it. Further options to customise this even more may be
659
+ added in the future.
660
+
661
+ ## Which fonts are available for ImageMagick?
662
+
663
+ The answer to this question depends on your computer system.
664
+
665
+ If you are, however had, like me and often forget then
666
+ the following list will contain some font names that
667
+ **may** be available on your linux system too. On Windows
668
+ I do not know whether these are available or not, but
669
+ since Linux is my main operating system I focus primarily
670
+ on Linux.
671
+
672
+ The following list is **not** complete - it just gives a
673
+ few helpful pointers to available names that **may** be
674
+ usable by you.
675
+
676
+ Here we go:
677
+
678
+ AvantGarde, Bookman, Courier, Helvetica, NewCenturySchlbk,
679
+ Palatino, Symbol, Times, Bitstream-Charter, Century-Schoolbook,
680
+ Chandas, Courier, DejaVu-Sans, DejaVu-Serif, Garuda, Hack-Regular,
681
+ Kedage-Normal, Kinnari, Liberation-Mono, Liberation-Sans,
682
+ Liberation-Serif, Loma, Luxi-Mono, Luxi-Sans, Luxi-Serif,
683
+ Mallige-Normal, Nimbus-Mono-L, Nimbus-Roman-No9-L,
684
+ Nimbus-Sans-L, NimbusMonoPS-Regular, NimbusSans-Bold,
685
+ Norasi-Bold, Noto-Mono, Noto-Serif-Bold, Oxygen-Mono,
686
+ Terminus-Regular, Umpush, URW-Gothic-L-Book, Utopia.
687
+
688
+ ## Embedding the filename into an image file
689
+
690
+ You can embed the filename (or any other text) into images
691
+ via **imagemagick**. In <b>April 2022</b>, I had a use
692
+ case where I needed to put down the name of the image
693
+ file into the image itself.
694
+
695
+ The syntax from the commandline looks as follows:
696
+
697
+ convert name_of_the_image_file_goes_here.jpg -font Luxi-Mono -pointsize 32 -draw "gravity northwest fill white text 0,15 'Filename' " output.jpg
698
+ convert TANA* -font Luxi-Mono -pointsize 32 -draw "gravity northwest fill white text 0,15 'Filename' " output.jpg
699
+
700
+ I wanted to automate this, though, so the following API
701
+ was added to the ImageParadise gem:
702
+
703
+ ImageParadise.embed_the_filename_into_this_image()
704
+ ImageParadise.embed_the_filename_into_this_image('name_of_the_image_file_goes_here.jpg')
705
+
706
+ This is not very customizable though as I just use it
707
+ for hardcoded values mostly. You may have to adjust it
708
+ to your own use case; at the least the method exists,
709
+ so you can modify it as-is. The second argument is a
710
+ Hash which allows for some modifications.
711
+
712
+ For instance, a larger text size can be done via:
713
+
714
+ ImageParadise.embed_the_filename_into_this_image('foobar.jpg', { font_size: 50 })
715
+
716
+ To combine this with a different colour use:
717
+
718
+ ImageParadise.embed_the_filename_into_this_image('foobar.jpg', { font_size: 50, colour_to_use: :tomato }) # You can use the HTML colours here.
719
+
720
+ Note that you can also pass a directory as the first
721
+ argument. So, rather than pass 'foobar.jpg', you
722
+ could pass '/foo/bar/' and the method will gather all
723
+ .gif, .jpg and .png files there, then work on these
724
+ one after the other. This allows us to batch-process
725
+ whole directories containing images. Don't forget
726
+ to keep a backup of these images **before** calling
727
+ this method, though!
728
+
729
+ Usage example:
730
+
731
+ ImageParadise.embed_the_filename_into_this_image('/foo/bar/')
732
+
733
+ ## Determining whether a given file is an animated image
734
+
735
+ The following functionality depends on ImageMagick.
736
+
737
+ To determine whether an image is animated you can use the following
738
+ API:
739
+
740
+ ImageParadise.is_this_image_animated?('/foobar.gif') # => true
741
+ ImageParadise.is_this_image_animated?("TANAKA.jpg") # => false
742
+
743
+ ## Determining whether a given file is an image file or whether it is not
744
+
745
+ You can use the following API to determine whether the given file is an
746
+ image file or whether it is not.
747
+
748
+ ImageParadise.is_an_image_file?()
749
+ ImageParadise.is_an_image?()
750
+
751
+ Both variants work fine. The second is a bit shorter, so let's look at a
752
+ specific example:
753
+
754
+ ImageParadise.is_an_image?('/tmp/cat.png')
755
+ ImageParadise.is_an_image?('/tmp/dog.gif')
756
+ ImageParadise.is_an_image?('/tmp/deer.bmp')
757
+
758
+ This will return true if it is an image, and false otherwise. Presently
759
+ (in 2022) this works via a constant where the file types are registered,
760
+ e. g. ".png" or ".jpg" all are files. In the future another method may
761
+ be added that uses either "file" to identify the file at hand, or another
762
+ variant by probing the content to determine whether this is really a file
763
+ or not. But currently no such API exists. If it will be added then it
764
+ will probably have another name, so for the time being
765
+ <b>ImageParadise.is_an_image?()</b> should suffice.
766
+
767
+ ## Support for chunky_png and examples using chunky_png
768
+
769
+ ChunkyPNG is a ruby-only library that helps the user create
770
+ .png files or read from existing .png files. It is super-convenient
771
+ to use, in many ways even easier to use than ImageMagick. On the
772
+ other hand, a lot of the functionality that ChunkPNG offers can
773
+ be used via ImageMagick. So perhaps ImageMagick is better.
774
+
775
+ Still - as ChunkyPNG exists, I decided to add support to it within
776
+ the namespace called <b>ImageParadise::ChunkyPNG</b>. This may
777
+ be a bit hackish, and support will not be complete, but just more
778
+ of an example what can be done via ChunkyPNG.
779
+
780
+ This subsection will list some examples.
781
+
782
+ To combine two .png files, and overlay one onto the other,
783
+ use:
784
+
785
+ ImageParadise::ChunkyPNG.overlay('Leeann_Tweeden.png','Cute_Biker.png', :center)
786
+
787
+ ## Support via Pango
788
+
789
+ ImageMagick knows how to use Pango.
790
+
791
+ Consider the following commandline examples:
792
+
793
+ convert -size 600x100 -gravity center -pointsize 48 pango:"The <span foreground='blue'>blue</span> word." output.png
794
+ convert -size 400x200 -gravity center -background khaki -pointsize 30 pango:"<i>A</i> &#x229B; <i>B</i> &#x21D2; <i>C</i>" chars.png
795
+ convert -size 400x200 -gravity northeast -background khaki -pointsize 30 pango:"<span foreground='green' size=\"55555\">A</span><span foreground='green' size=\"30000\">A</span><span size=\"30000\">B</span>C" chars.png
796
+
797
+ ## Resizing an image
798
+
799
+ <b>Images</b> (in 2D) typically have a width and a height setting,
800
+ such as 400px width and 300 px height. This is typically denoted
801
+ like this, via a shorthand notation: <b>400x300</b>.
802
+
803
+ Naturally you may want <b>to resize an image</b> eventually, for instance,
804
+ for displaying it on a webpage. Size often matters here, due to the
805
+ data volume passed to the recipient (the visitor).
806
+
807
+ <b>ImageMagick</b> allows you to resize an image, via the following
808
+ commandline invocation:
809
+
810
+ convert -resize 40% foobar.jpg output.jpg
811
+
812
+ This worked if you then use <b>identify</b> to check the width and
813
+ height:
814
+
815
+ identify foobar.jpg
816
+
817
+ Result: foobar.jpg JPEG 280x499 280x499+0+0 8-bit sRGB 32644B 0.000u 0:00.000
818
+
819
+ identify output.jpg
820
+
821
+ Result output.jpg JPEG 112x200 112x200+0+0 8-bit sRGB 8141B 0.000u 0:00.000
822
+
823
+ So, if you multiply 280.0 * 0.4 you get 112.0, which is precisely the width
824
+ value that the file <b>output.jpg</b> has.
825
+
826
+ I wanted <b>an API in ruby</b> that would allow me to do the same:
827
+
828
+ shrink foobar.jpg 40%
829
+
830
+ on the commandline. However had, I realised that I may want to omit
831
+ the <b>trailing %</b> specifically, or even omit the last part
832
+ altogether, thus only using the following commandline variant:
833
+
834
+ shrink foobar.jpg # the first argument is the locally existing file
835
+
836
+ In that case, <b>shrink</b> will shrink the image down to <b>75%</b>,
837
+ thus, width and height will be multiplied by a factor of 0.25 to obtain
838
+ the new width and height (rounded down, always, to get <b>integer pixel
839
+ values</b>).
840
+
841
+ If you want to do this from within ruby, you can, after requiring
842
+ the <b>image_paradise gem</b>, use any of the following:
843
+
844
+ ImageParadise.resize_by_percent('foobar.jpg')
845
+ ImageParadise.resize_by_percentage('foobar.jpg')
846
+ ImageParadise.resize_percent('foobar.jpg')
847
+ ImageParadise.percent('foobar.jpg', 20)
848
+ ImageParadise.percent('foobar.jpg', '30')
849
+ ImageParadise.percent('foobar.jpg', '40%')
850
+ ImageParadise.resize('foobar.jpg', '20%')
851
+ ImageParadise.resize('foobar.jpg', '30%')
852
+ ImageParadise.resize('foobar.jpg', '40%')
853
+
854
+ Use whatever variant you prefer here. The first one is the official name;
855
+ I think it is the best to remember. <b>ImageParadise.percent()</b>
856
+ exists mostly in the event that you quickly want to use it
857
+ from within <b>irb</b>, but you can also use the shorthand API
858
+ <b>ImageParadise.resize()</b> - it is all up to you.
859
+
860
+ The executable that bundles this functionality into a standalone
861
+ file can be found at <b>bin/resize_by_percent</b>.
862
+
863
+ ## Query the width and the height of an image
864
+
865
+ You can use the following method to determine (return) the
866
+ width of an image (in n px, aka n pixels):
867
+
868
+ ImageParadise.width_of_this_image?
869
+ ImageParadise.width_of_this_image?('foobar.png')
870
+ ImageParadise.width_of_this_image? "red_six_sided_die.png"
871
+
872
+ A similar method exists for the height of an image:
873
+
874
+ ImageParadise.height_of_this_image?
875
+ ImageParadise.height_of_this_image?('foobar.png')
876
+ ImageParadise.height_of_this_image? "red_six_sided_die.png"
877
+
878
+ ## Compression of images in general
879
+
880
+ This subsection just very briefly mentions a few interesting
881
+ knowledge bits about compressing images in general. It is just
882
+ a reminder, not an extensive article entry.
883
+
884
+ <b>Higher quality</b> in regards to images usually
885
+ means that there is <b>less compression</b> of the image
886
+ at hand.
887
+
888
+ Photographs tend to compress better with JPEG than with PNG.
889
+
890
+ The idea in all forms of compression is to reduce or eliminate
891
+ bits that do not convey their full potential information
892
+ content.
893
+
894
+ ## ImageParadise.monochrome
895
+
896
+ The ImageParadise.monochrome() API can be used to make an image
897
+ monochrome - aka only black and white.
898
+
899
+ Usage example:
900
+
901
+ x = ImageParadise.monochrome('/Depot/j/NJOY/VidaGuerra.jpg')()
902
+
903
+ ## ImageParadise.charcoal
904
+
905
+ Another way to get a black-white image is via
906
+ ImageParadise.charcoal.
907
+
908
+ Usage example:
909
+
910
+ result = ImageParadise.charcoal('Water.jpg')
911
+ result = ImageParadise.charcoal('/Depot/j/girl.jpg')
912
+
913
+ ## ImageParadise.canny
914
+
915
+ First, let's look at an image to see what <b>ImageParadise.canny()</b> does:
916
+
917
+ <img src="https://i.imgur.com/bAyhlmx.jpg" style="margin: 1em">
918
+
919
+ The result can be seen on the right side.
920
+
921
+ To use this for your own images, use the following API:
922
+
923
+ x = ImageParadise.canny('/Depot/j/NJOY/VidaGuerra.jpg')
924
+
925
+ ## Venetian gradient background
926
+
927
+ First, the image:
928
+
929
+ <img src="https://i.imgur.com/HHlU0hs.png" style="margin: 1em">
930
+
931
+ The API to use is:
932
+
933
+ ImageParadise.create_gradient(:venetian, '500x500', 'gray50')
934
+
935
+ The second argument specifies the width x height of the image
936
+ to be created anew.
937
+
938
+
939
+ ## Licence
940
+
941
+ The licence for this gem is the MIT licence.
942
+
943
+ Basically the most important part of the MIT licence is that, aside
944
+ from you being able to use the project as you see fit, is the no
945
+ warranty disclaimer to avoid any potential misuse from the use
946
+ of the software at hand.
947
+
948
+ You can read up on this licence here:
949
+
950
+ https://opensource.org/licenses/MIT
951
+
952
+ The usual copyright assignment is:
953
+
954
+ Copyright 2023 Robert Heiler
955
+
956
+
957
+
958
+ ## Contact information and mandatory 2FA coming up in 2022
959
+
960
+ If your creative mind has ideas and specific suggestions to make this gem
961
+ more useful in general, feel free to drop me an email at any time, via:
962
+
963
+ shevy@inbox.lt
964
+
965
+ Before that email I used an email account at Google gmail, but in **2021** I
966
+ decided to slowly abandon gmail, for various reasons. In order to limit the
967
+ explanation here, allow me to just briefly state that I do not feel as if I
968
+ want to promote any Google service anymore when the user becomes the end
969
+ product (such as via data collection by upstream services, including other
970
+ proxy-services). My feeling is that this is a hugely flawed business model
971
+ to begin with, and I no longer wish to support this in any way, even if
972
+ only indirectly so, such as by using services of companies that try to
973
+ promote this flawed model.
974
+
975
+ In regards to responding to emails: please keep in mind that responding
976
+ may take some time, depending on the amount of work I may have at that
977
+ moment. So it is not that emails are ignored; it is more that I have not
978
+ (yet) found the time to read and reply. This means there may be a delay
979
+ of days, weeks and in some instances also months. There is, unfortunately,
980
+ not much I can do when I need to prioritise my time investment, but I try
981
+ to consider <b>all</b> feedback as an opportunity to improve my projects
982
+ nonetheless.
983
+
984
+ In <b>2022</b> rubygems.org decided to make 2FA mandatory for every
985
+ gem owner eventually:
986
+
987
+ see
988
+ https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
989
+
990
+ Mandatory 2FA will eventually be extended to all rubygems.org developers and
991
+ maintainers. As I can not use 2FA, for reasons I will skip explaining here,
992
+ this means that my projects will eventually be removed, as I no longer
993
+ have any control over my projects hosted on rubygems.org (because I
994
+ can not use 2FA).
995
+
996
+ At that point, I no longer have any control what is done to my projects
997
+ since whoever is controlling the gems ecosystem took away our control
998
+ here. I am not sure at which point ruby became corporate-controlled -
999
+ that was not the case several years ago, so something has
1000
+ changed.
1001
+
1002
+ Ruby also only allows 2FA users to participate on the issue tracker these
1003
+ days:
1004
+
1005
+ https://bugs.ruby-lang.org/issues/18800
1006
+
1007
+ But this has been reverted some months ago, so it is no longer applicable.
1008
+ Suffice to say that I do not think that we should only be allowed to
1009
+ interact on the world wide web when some 'authority' authenticated us,
1010
+ such as via mandatory 2FA, so I hope this won't come back again.
1011
+
1012
+ Fighting spam is a noble goal, but when it also means you lock out
1013
+ real human people then this is definitely NOT a good situation
1014
+ to be had.
1015
+