image_paradise 0.4.8
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.
- checksums.yaml +7 -0
- data/LICENSE.md +38 -0
- data/README.md +928 -0
- data/USAGE.md +10 -0
- data/bin/black_white +10 -0
- data/bin/confree_generator +7 -0
- data/bin/create_new_image +7 -0
- data/bin/display_text_from_this_image +7 -0
- data/bin/draw_as_specified_from_the_yaml_file +7 -0
- data/bin/embed_the_filename_into_this_image +7 -0
- data/bin/image_paradise +7 -0
- data/bin/image_paradise_shell +7 -0
- data/bin/image_to_ascii +54 -0
- data/bin/image_to_pdf +7 -0
- data/bin/imageparadise_img2pdf +12 -0
- data/bin/img_text +14 -0
- data/bin/interlace +7 -0
- data/bin/jpg_to_pdf +12 -0
- data/bin/magic_card_border +8 -0
- data/bin/make_this_image_transparent +7 -0
- data/bin/morph_these_images +7 -0
- data/bin/optimize_this_image +7 -0
- data/bin/quality +7 -0
- data/bin/resize_by_percent +10 -0
- data/bin/rotate_left +7 -0
- data/bin/rotate_right +7 -0
- data/bin/round_the_corner +7 -0
- data/bin/ruby_montage +7 -0
- data/bin/transparent +15 -0
- data/doc/README.gen +871 -0
- data/doc/todo/TODO_FOR_THE_GTK_GUI.md +9 -0
- data/doc/todo/TODO_FOR_THE_IMAGE_PARADISE_PROJECT.md +22 -0
- data/doc/todo/TODO_WORK_THROUGH_THESE_LINKS.md +3 -0
- data/doc/todo/todo_for_the_libui_gui.md +4 -0
- data/image_paradise.gemspec +46 -0
- data/images/IMAGE_PARADISE_LOGO.png +0 -0
- data/lib/image_paradise/base/base.rb +293 -0
- data/lib/image_paradise/cfdg/1dca_pattern.cfdg +48 -0
- data/lib/image_paradise/cfdg/3d_coloured_cube.cfdg +95 -0
- data/lib/image_paradise/cfdg/a_3D_spiral.cfdg +40 -0
- data/lib/image_paradise/cfdg/a_chaotic_city.cfdg +156 -0
- data/lib/image_paradise/cfdg/a_coloured_red.cfdg +21 -0
- data/lib/image_paradise/cfdg/a_daisy_flower.cfdg +66 -0
- data/lib/image_paradise/cfdg/a_decorated_window.cfdg +74 -0
- data/lib/image_paradise/cfdg/a_human_profile.cfdg +303 -0
- data/lib/image_paradise/cfdg/a_lost_heart.cfdg +28 -0
- data/lib/image_paradise/cfdg/a_plant_root.cfdg +26 -0
- data/lib/image_paradise/cfdg/a_rather_realistic_forest.cfdg +29 -0
- data/lib/image_paradise/cfdg/a_shoreline_next_to_a_forest.cfdg +127 -0
- data/lib/image_paradise/cfdg/a_simple_mini_brain.cfdg +17 -0
- data/lib/image_paradise/cfdg/a_simple_star.cfdg +22 -0
- data/lib/image_paradise/cfdg/adorned_tree.cfdg +58 -0
- data/lib/image_paradise/cfdg/adsorption.cfdg +19 -0
- data/lib/image_paradise/cfdg/alfabet_free.cfdg +346 -0
- data/lib/image_paradise/cfdg/alfreebet.cfdg +229 -0
- data/lib/image_paradise/cfdg/algal_flora.cfdg +25 -0
- data/lib/image_paradise/cfdg/alien_eyeball.cfdg +15 -0
- data/lib/image_paradise/cfdg/alien_flower.cfdg +35 -0
- data/lib/image_paradise/cfdg/alphabet_circles.cfdg +38 -0
- data/lib/image_paradise/cfdg/alveolo.cfdg +38 -0
- data/lib/image_paradise/cfdg/an_icosahedron.cfdg +134 -0
- data/lib/image_paradise/cfdg/an_oils_surface.cfdg +48 -0
- data/lib/image_paradise/cfdg/ancient_map.cfdg +30 -0
- data/lib/image_paradise/cfdg/ancient_scripts_tile.cfdg +96 -0
- data/lib/image_paradise/cfdg/angelfish.cfdg +58 -0
- data/lib/image_paradise/cfdg/angry_yarn.cfdg +82 -0
- data/lib/image_paradise/cfdg/apple_tree_small.cfdg +46 -0
- data/lib/image_paradise/cfdg/aqua_star.cfdg +27 -0
- data/lib/image_paradise/cfdg/army_explosion.cfdg +25 -0
- data/lib/image_paradise/cfdg/arrows_in_quadcity.cfdg +143 -0
- data/lib/image_paradise/cfdg/artificial_intelligence.cfdg +41 -0
- data/lib/image_paradise/cfdg/askew.cfdg +27 -0
- data/lib/image_paradise/cfdg/audio_diagram_waves.cfdg +54 -0
- data/lib/image_paradise/cfdg/autumn_fractal.cfdg +39 -0
- data/lib/image_paradise/cfdg/baignoire.cfdg +33 -0
- data/lib/image_paradise/cfdg/barcode.cfdg +781 -0
- data/lib/image_paradise/cfdg/basic_polygon_shapes.cfdg +311 -0
- data/lib/image_paradise/cfdg/basic_spreaders.cfdg +52 -0
- data/lib/image_paradise/cfdg/basic_square.cfdg +8 -0
- data/lib/image_paradise/cfdg/bats_hiding_in_foliage.cfdg +19 -0
- data/lib/image_paradise/cfdg/bees.cfdg +61 -0
- data/lib/image_paradise/cfdg/bent_squares.cfdg +46 -0
- data/lib/image_paradise/cfdg/benzo_dreaming.cfdg +54 -0
- data/lib/image_paradise/cfdg/beta_bet.cfdg +645 -0
- data/lib/image_paradise/cfdg/big_bang_theory.cfdg +31 -0
- data/lib/image_paradise/cfdg/big_pacman.cfdg +70 -0
- data/lib/image_paradise/cfdg/bigger_tree.cfdg +64 -0
- data/lib/image_paradise/cfdg/binary_connection.cfdg +34 -0
- data/lib/image_paradise/cfdg/birch_line.cfdg +57 -0
- data/lib/image_paradise/cfdg/blacksmith_masterpiece.cfdg +3 -0
- data/lib/image_paradise/cfdg/blocked_rectangles.cfdg +23 -0
- data/lib/image_paradise/cfdg/blood_tubes.cfdg +45 -0
- data/lib/image_paradise/cfdg/bloom.cfdg +23 -0
- data/lib/image_paradise/cfdg/blown_glass_spheres.cfdg +30 -0
- data/lib/image_paradise/cfdg/blue_daisies_in_detail.cfdg +101 -0
- data/lib/image_paradise/cfdg/blue_galaxy.cfdg +20 -0
- data/lib/image_paradise/cfdg/blue_moon.cfdg +36 -0
- data/lib/image_paradise/cfdg/boa_feathers.cfdg +53 -0
- data/lib/image_paradise/cfdg/bomb.cfdg +75 -0
- data/lib/image_paradise/cfdg/boxy_continent.cfdg +111 -0
- data/lib/image_paradise/cfdg/bright_coloured_neurons.cfdg +53 -0
- data/lib/image_paradise/cfdg/brightness_flower.cfdg +31 -0
- data/lib/image_paradise/cfdg/btp_71_beautiful_coloured_lines.cfdg +85 -0
- data/lib/image_paradise/cfdg/btp_73.cfdg +76 -0
- data/lib/image_paradise/cfdg/bubblesun.cfdg +46 -0
- data/lib/image_paradise/cfdg/burning_bush.cfdg +31 -0
- data/lib/image_paradise/cfdg/butterflies_in_the_moonlight.cfdg +55 -0
- data/lib/image_paradise/cfdg/cardiod_arc.cfdg +44 -0
- data/lib/image_paradise/cfdg/cardioid.cfdg +41 -0
- data/lib/image_paradise/cfdg/caros_wallpaper.cfdg +46 -0
- data/lib/image_paradise/cfdg/cartoony_face_arrays.cfdg +137 -0
- data/lib/image_paradise/cfdg/centerfold.cfdg +12 -0
- data/lib/image_paradise/cfdg/chain_link_fence.cfdg +31 -0
- data/lib/image_paradise/cfdg/chanukah.cfdg +109 -0
- data/lib/image_paradise/cfdg/chaos_red_sun.cfdg +42 -0
- data/lib/image_paradise/cfdg/chaotic_farn.cfdg +76 -0
- data/lib/image_paradise/cfdg/chaotic_fractal_shell.cfdg +41 -0
- data/lib/image_paradise/cfdg/charleston.cfdg +182 -0
- data/lib/image_paradise/cfdg/ciliasun.cfdg +109 -0
- data/lib/image_paradise/cfdg/cipal.cfdg +65 -0
- data/lib/image_paradise/cfdg/circuits.cfdg +176 -0
- data/lib/image_paradise/cfdg/city_map.cfdg +66 -0
- data/lib/image_paradise/cfdg/clifford_torus.cfdg +135 -0
- data/lib/image_paradise/cfdg/colonize_flat_colour_pattern.cfdg +14 -0
- data/lib/image_paradise/cfdg/colour_blind_squid.cfdg +30 -0
- data/lib/image_paradise/cfdg/colour_hole.cfdg +56 -0
- data/lib/image_paradise/cfdg/colour_wheel.cfdg +40 -0
- data/lib/image_paradise/cfdg/coloured_eyes.cfdg +40 -0
- data/lib/image_paradise/cfdg/coloured_forest.cfdg +133 -0
- data/lib/image_paradise/cfdg/coloured_tree.cfdg +50 -0
- data/lib/image_paradise/cfdg/colourful_lives.cfdg +123 -0
- data/lib/image_paradise/cfdg/colourful_neuronal_network.cfdg +32 -0
- data/lib/image_paradise/cfdg/complex_city_plans.cfdg +75 -0
- data/lib/image_paradise/cfdg/complex_kritworks.cfdg +75 -0
- data/lib/image_paradise/cfdg/complex_snowflake.cfdg +61 -0
- data/lib/image_paradise/cfdg/conspiracy_theory.cfdg +104 -0
- data/lib/image_paradise/cfdg/constellation_grid.cfdg +29 -0
- data/lib/image_paradise/cfdg/cool_caterpillar.cfdg +44 -0
- data/lib/image_paradise/cfdg/coolcubes.cfdg +70 -0
- data/lib/image_paradise/cfdg/crawler_battle.cfdg +93 -0
- data/lib/image_paradise/cfdg/crazy_octo.cfdg +48 -0
- data/lib/image_paradise/cfdg/cthulhu.cfdg +166 -0
- data/lib/image_paradise/cfdg/cubies.cfdg +43 -0
- data/lib/image_paradise/cfdg/cubist_sunset.cfdg +55 -0
- data/lib/image_paradise/cfdg/curled_tree.cfdg +37 -0
- data/lib/image_paradise/cfdg/curls.cfdg +45 -0
- data/lib/image_paradise/cfdg/curve_stiched.cfdg +59 -0
- data/lib/image_paradise/cfdg/curved_tubes.cfdg +20 -0
- data/lib/image_paradise/cfdg/cylinder_city.cfdg +27 -0
- data/lib/image_paradise/cfdg/cymbal.cfdg +38 -0
- data/lib/image_paradise/cfdg/d_mustard.cfdg +52 -0
- data/lib/image_paradise/cfdg/dance_party.cfdg +81 -0
- data/lib/image_paradise/cfdg/dance_party_and_background.cfdg +86 -0
- data/lib/image_paradise/cfdg/decreasing_aperture.cfdg +16 -0
- data/lib/image_paradise/cfdg/delicat_twist.cfdg +13 -0
- data/lib/image_paradise/cfdg/demo_text.cfdg +22 -0
- data/lib/image_paradise/cfdg/dennis_ritchie.cfdg +294 -0
- data/lib/image_paradise/cfdg/diablo.cfdg +47 -0
- data/lib/image_paradise/cfdg/different_flowers.cfdg +60 -0
- data/lib/image_paradise/cfdg/different_snowflakes_shapes.cfdg +149 -0
- data/lib/image_paradise/cfdg/dimensions.cfdg +33 -0
- data/lib/image_paradise/cfdg/domino_pieces.cfdg +166 -0
- data/lib/image_paradise/cfdg/dong.cfdg +41 -0
- data/lib/image_paradise/cfdg/drip_shape.cfdg +24 -0
- data/lib/image_paradise/cfdg/earthday2007b.cfdg +49 -0
- data/lib/image_paradise/cfdg/edera_circles.cfdg +55 -0
- data/lib/image_paradise/cfdg/eight_queens_problem.cfdg +85 -0
- data/lib/image_paradise/cfdg/electro_shock.cfdg +88 -0
- data/lib/image_paradise/cfdg/enter_the_force_field.cfdg +56 -0
- data/lib/image_paradise/cfdg/escargot_fleur.cfdg +98 -0
- data/lib/image_paradise/cfdg/european_city.cfdg +63 -0
- data/lib/image_paradise/cfdg/evil_eye.cfdg +74 -0
- data/lib/image_paradise/cfdg/evolving_coloured_spots.cfdg +47 -0
- data/lib/image_paradise/cfdg/excellines_nr2.cfdg +171 -0
- data/lib/image_paradise/cfdg/exoplanet_settlement.cfdg +117 -0
- data/lib/image_paradise/cfdg/explosion.cfdg +45 -0
- data/lib/image_paradise/cfdg/explosion_of_a_megabyte.cfdg +73 -0
- data/lib/image_paradise/cfdg/eye_of_katora.cfdg +20 -0
- data/lib/image_paradise/cfdg/family_tree.cfdg +169 -0
- data/lib/image_paradise/cfdg/feathers.cfdg +17 -0
- data/lib/image_paradise/cfdg/ferma_drawings.cfdg +23 -0
- data/lib/image_paradise/cfdg/fevrier.cfdg +66 -0
- data/lib/image_paradise/cfdg/fibmod.cfdg +25 -0
- data/lib/image_paradise/cfdg/field_of_boxes.cfdg +21 -0
- data/lib/image_paradise/cfdg/finetre.cfdg +34 -0
- data/lib/image_paradise/cfdg/fireblorks.cfdg +37 -0
- data/lib/image_paradise/cfdg/first_branch.cfdg +18 -0
- data/lib/image_paradise/cfdg/fish_with_coloured_bubbles.cfdg +77 -0
- data/lib/image_paradise/cfdg/fishing_lure.cfdg +30 -0
- data/lib/image_paradise/cfdg/flake.cfdg +20 -0
- data/lib/image_paradise/cfdg/flaming_spiro.cfdg +10 -0
- data/lib/image_paradise/cfdg/fleshflower.cfdg +25 -0
- data/lib/image_paradise/cfdg/flourescent_fish_btp.cfdg +48 -0
- data/lib/image_paradise/cfdg/flow_control_shape.cfdg +45 -0
- data/lib/image_paradise/cfdg/flower_galaxy.cfdg +57 -0
- data/lib/image_paradise/cfdg/flower_house.cfdg +115 -0
- data/lib/image_paradise/cfdg/flower_stories.cfdg +136 -0
- data/lib/image_paradise/cfdg/fluctuating_heart.cfdg +87 -0
- data/lib/image_paradise/cfdg/fly_agaric.cfdg +22 -0
- data/lib/image_paradise/cfdg/forest_and_ocean.cfdg +65 -0
- data/lib/image_paradise/cfdg/fractal_fern.cfdg +15 -0
- data/lib/image_paradise/cfdg/fractal_shell.cfdg +36 -0
- data/lib/image_paradise/cfdg/frost_bite.cfdg +23 -0
- data/lib/image_paradise/cfdg/fun_with_paper.cfdg +17 -0
- data/lib/image_paradise/cfdg/func_plot.cfdg +59 -0
- data/lib/image_paradise/cfdg/funky_squiggle.cfdg +40 -0
- data/lib/image_paradise/cfdg/fuzzy_sun.cfdg +47 -0
- data/lib/image_paradise/cfdg/galaxy.cfdg +59 -0
- data/lib/image_paradise/cfdg/gallery.cfdg +28 -0
- data/lib/image_paradise/cfdg/game1_turn6.cfdg +35 -0
- data/lib/image_paradise/cfdg/garland.cfdg +42 -0
- data/lib/image_paradise/cfdg/general_polygons.cfdg +20 -0
- data/lib/image_paradise/cfdg/generational_birds.cfdg +118 -0
- data/lib/image_paradise/cfdg/ghostly_spine.cfdg +24 -0
- data/lib/image_paradise/cfdg/gift_wrapping.cfdg +46 -0
- data/lib/image_paradise/cfdg/glass_cubes.cfdg +33 -0
- data/lib/image_paradise/cfdg/gleaming_bush.cfdg +33 -0
- data/lib/image_paradise/cfdg/glowing_bush.cfdg +33 -0
- data/lib/image_paradise/cfdg/go_grid.cfdg +32 -0
- data/lib/image_paradise/cfdg/gold_tiles.cfdg +21 -0
- data/lib/image_paradise/cfdg/golden_rectangle.cfdg +19 -0
- data/lib/image_paradise/cfdg/golden_sierpinski.cfdg +49 -0
- data/lib/image_paradise/cfdg/golgi_stain.cfdg +74 -0
- data/lib/image_paradise/cfdg/gothic_bath_tiles.cfdg +14 -0
- data/lib/image_paradise/cfdg/grass_land.cfdg +112 -0
- data/lib/image_paradise/cfdg/gray_matter.cfdg +110 -0
- data/lib/image_paradise/cfdg/great_forest.cfdg +91 -0
- data/lib/image_paradise/cfdg/growth.cfdg +46 -0
- data/lib/image_paradise/cfdg/gumtree.cfdg +28 -0
- data/lib/image_paradise/cfdg/haggards_bull.cfdg +92 -0
- data/lib/image_paradise/cfdg/haight_ashbury.cfdg +882 -0
- data/lib/image_paradise/cfdg/hair_pattern.cfdg +59 -0
- data/lib/image_paradise/cfdg/hairy.cfdg +43 -0
- data/lib/image_paradise/cfdg/hairy_branch.cfdg +48 -0
- data/lib/image_paradise/cfdg/hands_and_feet.cfdg +49 -0
- data/lib/image_paradise/cfdg/happy_new_year.cfdg +3435 -0
- data/lib/image_paradise/cfdg/hatagu_lila_spiral.cfdg +27 -0
- data/lib/image_paradise/cfdg/hexaeder_triangle.cfdg +43 -0
- data/lib/image_paradise/cfdg/hexclouds_textures.cfdg +75 -0
- data/lib/image_paradise/cfdg/hextiles.cfdg +73 -0
- data/lib/image_paradise/cfdg/hexy_continent.cfdg +83 -0
- data/lib/image_paradise/cfdg/human_ballet.cfdg +215 -0
- data/lib/image_paradise/cfdg/human_eyes.cfdg +102 -0
- data/lib/image_paradise/cfdg/hydra_tail.cfdg +57 -0
- data/lib/image_paradise/cfdg/i_like_it_dirty.cfdg +88 -0
- data/lib/image_paradise/cfdg/i_pix.cfdg +679 -0
- data/lib/image_paradise/cfdg/imaginary_star.cfdg +55 -0
- data/lib/image_paradise/cfdg/imaginery_forest.cfdg +61 -0
- data/lib/image_paradise/cfdg/impossible_stairs.cfdg +211 -0
- data/lib/image_paradise/cfdg/in_the_morning.cfdg +83 -0
- data/lib/image_paradise/cfdg/inertial_confinement.cfdg +150 -0
- data/lib/image_paradise/cfdg/infected_shell.cfdg +56 -0
- data/lib/image_paradise/cfdg/insect_fight.cfdg +316 -0
- data/lib/image_paradise/cfdg/insectivore.cfdg +80 -0
- data/lib/image_paradise/cfdg/interference.cfdg +43 -0
- data/lib/image_paradise/cfdg/interference_fields.cfdg +25 -0
- data/lib/image_paradise/cfdg/into_the_deep.cfdg +96 -0
- data/lib/image_paradise/cfdg/inverted_decorations.cfdg +85 -0
- data/lib/image_paradise/cfdg/irregular_galaxies.cfdg +29 -0
- data/lib/image_paradise/cfdg/iso_blocks.cfdg +35 -0
- data/lib/image_paradise/cfdg/jewelry_old_style.cfdg +31 -0
- data/lib/image_paradise/cfdg/just_some_flowers.cfdg +127 -0
- data/lib/image_paradise/cfdg/kaboom.cfdg +40 -0
- data/lib/image_paradise/cfdg/kaleidoskop.cfdg +27 -0
- data/lib/image_paradise/cfdg/kama_sutra.cfdg +182 -0
- data/lib/image_paradise/cfdg/kitakoa_akiyoshi_illusions_roller.cfdg +40 -0
- data/lib/image_paradise/cfdg/koch_snowflake.cfdg +11 -0
- data/lib/image_paradise/cfdg/kochlea.cfdg +43 -0
- data/lib/image_paradise/cfdg/kreepykrawler.cfdg +48 -0
- data/lib/image_paradise/cfdg/kw_expanded_explosion.cfdg +46 -0
- data/lib/image_paradise/cfdg/lapsang_abstrait.cfdg +51 -0
- data/lib/image_paradise/cfdg/laser.cfdg +51 -0
- data/lib/image_paradise/cfdg/last_pluto_dream.cfdg +95 -0
- data/lib/image_paradise/cfdg/lazy_dust.cfdg +42 -0
- data/lib/image_paradise/cfdg/lesson_one_two_three_four.cfdg +217 -0
- data/lib/image_paradise/cfdg/lila_lili.cfdg +60 -0
- data/lib/image_paradise/cfdg/lindenmayergrassef2_pretty_flowers.cfdg +94 -0
- data/lib/image_paradise/cfdg/lines_from_excel.cfdg +136 -0
- data/lib/image_paradise/cfdg/looking_out.cfdg +51 -0
- data/lib/image_paradise/cfdg/looking_up_in_the_sky.cfdg +43 -0
- data/lib/image_paradise/cfdg/lotus_logo.cfdg +49 -0
- data/lib/image_paradise/cfdg/lowercased_alphabet.cfdg +565 -0
- data/lib/image_paradise/cfdg/luma_smiley.cfdg +563 -0
- data/lib/image_paradise/cfdg/maggi_stars.cfdg +11 -0
- data/lib/image_paradise/cfdg/mandelbrot_3.cfdg +111 -0
- data/lib/image_paradise/cfdg/martini.cfdg +147 -0
- data/lib/image_paradise/cfdg/material_studies.cfdg +172 -0
- data/lib/image_paradise/cfdg/math_eye.cfdg +30 -0
- data/lib/image_paradise/cfdg/matrix_freestyle.cfdg +127 -0
- data/lib/image_paradise/cfdg/maze.cfdg +211 -0
- data/lib/image_paradise/cfdg/meaculpo.cfdg +46 -0
- data/lib/image_paradise/cfdg/medieval_madness.cfdg +140 -0
- data/lib/image_paradise/cfdg/menage_a_trois.cfdg +77 -0
- data/lib/image_paradise/cfdg/micky_mouse.cfdg +75 -0
- data/lib/image_paradise/cfdg/mistletoe_forest.cfdg +62 -0
- data/lib/image_paradise/cfdg/mixed_simple_bubbles.cfdg +20 -0
- data/lib/image_paradise/cfdg/mod4g_starhole.cfdg +27 -0
- data/lib/image_paradise/cfdg/moebius.cfdg +57 -0
- data/lib/image_paradise/cfdg/molecules.cfdg +30 -0
- data/lib/image_paradise/cfdg/momos_blossom.cfdg +70 -0
- data/lib/image_paradise/cfdg/mona_lisa.cfdg +7937 -0
- data/lib/image_paradise/cfdg/more_arrows_in_quadcity.cfdg +49 -0
- data/lib/image_paradise/cfdg/more_cats.cfdg +1002 -0
- data/lib/image_paradise/cfdg/mosaic_for_2D_games.cfdg +69 -0
- data/lib/image_paradise/cfdg/mr_bezier.cfdg +195 -0
- data/lib/image_paradise/cfdg/mtree.cfdg +33 -0
- data/lib/image_paradise/cfdg/multiple_triangles.cfdg +13 -0
- data/lib/image_paradise/cfdg/mycel.cfdg +88 -0
- data/lib/image_paradise/cfdg/mytohexagone.cfdg +56 -0
- data/lib/image_paradise/cfdg/nature_is_not_like_that.cfdg +48 -0
- data/lib/image_paradise/cfdg/negative_flowers.cfdg +85 -0
- data/lib/image_paradise/cfdg/neo_town.cfdg +41 -0
- data/lib/image_paradise/cfdg/nesting_pattern.cfdg +34 -0
- data/lib/image_paradise/cfdg/neuronal_network.cfdg +94 -0
- data/lib/image_paradise/cfdg/neuronal_root.cfdg +46 -0
- data/lib/image_paradise/cfdg/night.cfdg +82 -0
- data/lib/image_paradise/cfdg/nightwalker.cfdg +23 -0
- data/lib/image_paradise/cfdg/no_xcape.cfdg +41 -0
- data/lib/image_paradise/cfdg/noise.cfdg +12 -0
- data/lib/image_paradise/cfdg/octopodi.cfdg +51 -0
- data/lib/image_paradise/cfdg/octopussy.cfdg +49 -0
- data/lib/image_paradise/cfdg/oldschool_cartoon_figure.cfdg +181 -0
- data/lib/image_paradise/cfdg/open_shapes.cfdg +240 -0
- data/lib/image_paradise/cfdg/orange_blossom.cfdg +57 -0
- data/lib/image_paradise/cfdg/orange_guts.cfdg +43 -0
- data/lib/image_paradise/cfdg/orange_monster.cfdg +42 -0
- data/lib/image_paradise/cfdg/organic.cfdg +30 -0
- data/lib/image_paradise/cfdg/ouo_happy_smiley.cfdg +45 -0
- data/lib/image_paradise/cfdg/output.png +0 -0
- data/lib/image_paradise/cfdg/pacman.cfdg +18 -0
- data/lib/image_paradise/cfdg/palmen.cfdg +162 -0
- data/lib/image_paradise/cfdg/pandoras_box.cfdg +53 -0
- data/lib/image_paradise/cfdg/papillon_butterfly.cfdg +28 -0
- data/lib/image_paradise/cfdg/patchwork.cfdg +32 -0
- data/lib/image_paradise/cfdg/pattern_grass.cfdg +110 -0
- data/lib/image_paradise/cfdg/peau_de_grenouille.cfdg +16 -0
- data/lib/image_paradise/cfdg/penrose_tiling.cfdg +102 -0
- data/lib/image_paradise/cfdg/pentagon.cfdg +68 -0
- data/lib/image_paradise/cfdg/pentagons.cfdg +25 -0
- data/lib/image_paradise/cfdg/perspective_tsunami.cfdg +20 -0
- data/lib/image_paradise/cfdg/phi_cloud.cfdg +23 -0
- data/lib/image_paradise/cfdg/picnic_birds_eye_view.cfdg +132 -0
- data/lib/image_paradise/cfdg/ping_pong.cfdg +29 -0
- data/lib/image_paradise/cfdg/pink_blossom.cfdg +58 -0
- data/lib/image_paradise/cfdg/piupole.cfdg +77 -0
- data/lib/image_paradise/cfdg/plotting.cfdg +61 -0
- data/lib/image_paradise/cfdg/point_onto_root.cfdg +64 -0
- data/lib/image_paradise/cfdg/primitive_reptile_pattern.cfdg +96 -0
- data/lib/image_paradise/cfdg/psycho_knot.cfdg +20 -0
- data/lib/image_paradise/cfdg/pyramide.cfdg +67 -0
- data/lib/image_paradise/cfdg/pythagoras_puzzle.cfdg +17 -0
- data/lib/image_paradise/cfdg/pythagorean_tree.cfdg +70 -0
- data/lib/image_paradise/cfdg/qimica.cfdg +64 -0
- data/lib/image_paradise/cfdg/quad_green_satellite.cfdg +53 -0
- data/lib/image_paradise/cfdg/quadcity.cfdg +24 -0
- data/lib/image_paradise/cfdg/quiet_wood_town.cfdg +195 -0
- data/lib/image_paradise/cfdg/r180.cfdg +26 -0
- data/lib/image_paradise/cfdg/r45.cfdg +26 -0
- data/lib/image_paradise/cfdg/r_square.cfdg +36 -0
- data/lib/image_paradise/cfdg/rads.cfdg +33 -0
- data/lib/image_paradise/cfdg/rainbow_black_hole.cfdg +9 -0
- data/lib/image_paradise/cfdg/rainbow_sun.cfdg +9 -0
- data/lib/image_paradise/cfdg/random_handwriting.cfdg +50 -0
- data/lib/image_paradise/cfdg/random_tile_shapes_jens_revisited.cfdg +146 -0
- data/lib/image_paradise/cfdg/rays_attack.cfdg +29 -0
- data/lib/image_paradise/cfdg/razpad.cfdg +20 -0
- data/lib/image_paradise/cfdg/rectangular_distortion.cfdg +169 -0
- data/lib/image_paradise/cfdg/recurse_path.cfdg +38 -0
- data/lib/image_paradise/cfdg/red_flurry.cfdg +64 -0
- data/lib/image_paradise/cfdg/red_horse_tail.cfdg +36 -0
- data/lib/image_paradise/cfdg/red_yellow_mosaic.cfdg +26 -0
- data/lib/image_paradise/cfdg/rendering_tests.cfdg +183 -0
- data/lib/image_paradise/cfdg/repeat_floor_tile_pattern.cfdg +153 -0
- data/lib/image_paradise/cfdg/repeat_tile.cfdg +160 -0
- data/lib/image_paradise/cfdg/retro_disc.cfdg +736 -0
- data/lib/image_paradise/cfdg/ring_growth_variation.cfdg +41 -0
- data/lib/image_paradise/cfdg/robot_nightlife.cfdg +25 -0
- data/lib/image_paradise/cfdg/rolled_firespiral.cfdg +34 -0
- data/lib/image_paradise/cfdg/rose.cfdg +44 -0
- data/lib/image_paradise/cfdg/round_tree.cfdg +121 -0
- data/lib/image_paradise/cfdg/rubiks_cube.cfdg +120 -0
- data/lib/image_paradise/cfdg/ruins.cfdg +19 -0
- data/lib/image_paradise/cfdg/sails_and_the_sea.cfdg +27 -0
- data/lib/image_paradise/cfdg/salt_crystals.cfdg +26 -0
- data/lib/image_paradise/cfdg/saturn.cfdg +105 -0
- data/lib/image_paradise/cfdg/scary_pot.cfdg +49 -0
- data/lib/image_paradise/cfdg/schematic_worm.cfdg +35 -0
- data/lib/image_paradise/cfdg/school_script.cfdg +359 -0
- data/lib/image_paradise/cfdg/seahorse.cfdg +78 -0
- data/lib/image_paradise/cfdg/seasons.cfdg +115 -0
- data/lib/image_paradise/cfdg/segmental_veins.cfdg +66 -0
- data/lib/image_paradise/cfdg/select_mayhem.cfdg +28 -0
- data/lib/image_paradise/cfdg/seven_folded_symmetry.cfdg +7 -0
- data/lib/image_paradise/cfdg/several_cats.cfdg +996 -0
- data/lib/image_paradise/cfdg/shadow_box.cfdg +49 -0
- data/lib/image_paradise/cfdg/shadowrun_google_maps.cfdg +66 -0
- data/lib/image_paradise/cfdg/shadowrun_nightline.cfdg +18 -0
- data/lib/image_paradise/cfdg/shards.cfdg +70 -0
- data/lib/image_paradise/cfdg/sheet_music.cfdg +213 -0
- data/lib/image_paradise/cfdg/shy_guy.cfdg +886 -0
- data/lib/image_paradise/cfdg/sierpinski1.cfdg +41 -0
- data/lib/image_paradise/cfdg/sierpinski2.cfdg +34 -0
- data/lib/image_paradise/cfdg/sierpinski_like_red_swirl.cfdg +46 -0
- data/lib/image_paradise/cfdg/sierpinsktri.cfdg +9 -0
- data/lib/image_paradise/cfdg/silk_flowers.cfdg +68 -0
- data/lib/image_paradise/cfdg/silk_scarf.cfdg +18 -0
- data/lib/image_paradise/cfdg/simple_cilia.cfdg +88 -0
- data/lib/image_paradise/cfdg/simple_circle_and_square.cfdg +7 -0
- data/lib/image_paradise/cfdg/simple_coloured_square.cfdg +38 -0
- data/lib/image_paradise/cfdg/simple_ferns.cfdg +40 -0
- data/lib/image_paradise/cfdg/simple_fish.cfdg +77 -0
- data/lib/image_paradise/cfdg/simple_orchid.cfdg +23 -0
- data/lib/image_paradise/cfdg/simple_rounded_colour_wheel.cfdg +10 -0
- data/lib/image_paradise/cfdg/simple_sheet_music.cfdg +27 -0
- data/lib/image_paradise/cfdg/sincos_pattern_2.cfdg +42 -0
- data/lib/image_paradise/cfdg/singing_birdy.cfdg +112 -0
- data/lib/image_paradise/cfdg/skyscraper.cfdg +85 -0
- data/lib/image_paradise/cfdg/small_golden_rectangle.cfdg +12 -0
- data/lib/image_paradise/cfdg/smells_like_layered.cfdg +43 -0
- data/lib/image_paradise/cfdg/snowflake.cfdg +26 -0
- data/lib/image_paradise/cfdg/snowstorm.cfdg +26 -0
- data/lib/image_paradise/cfdg/soar_on_wings.cfdg +8 -0
- data/lib/image_paradise/cfdg/soft_core.cfdg +26 -0
- data/lib/image_paradise/cfdg/soft_touch.cfdg +20 -0
- data/lib/image_paradise/cfdg/some_sort_of_tree.cfdg +57 -0
- data/lib/image_paradise/cfdg/spade_ball.cfdg +39 -0
- data/lib/image_paradise/cfdg/sparks.cfdg +39 -0
- data/lib/image_paradise/cfdg/sperm.cfdg +63 -0
- data/lib/image_paradise/cfdg/sphinx.cfdg +17 -0
- data/lib/image_paradise/cfdg/spiral_clusters.cfdg +29 -0
- data/lib/image_paradise/cfdg/spiral_cross.cfdg +27 -0
- data/lib/image_paradise/cfdg/spiral_star.cfdg +19 -0
- data/lib/image_paradise/cfdg/spiral_sun.cfdg +39 -0
- data/lib/image_paradise/cfdg/spirit.cfdg +47 -0
- data/lib/image_paradise/cfdg/splatter_tree.cfdg +61 -0
- data/lib/image_paradise/cfdg/spliced.cfdg +27 -0
- data/lib/image_paradise/cfdg/spring_parade.cfdg +105 -0
- data/lib/image_paradise/cfdg/sprinkle_explosion.cfdg +23 -0
- data/lib/image_paradise/cfdg/square_limit_one.cfdg +15 -0
- data/lib/image_paradise/cfdg/square_rose.cfdg +75 -0
- data/lib/image_paradise/cfdg/square_spiral4.cfdg +41 -0
- data/lib/image_paradise/cfdg/square_star.cfdg +39 -0
- data/lib/image_paradise/cfdg/squiggle.cfdg +54 -0
- data/lib/image_paradise/cfdg/stacked_blob.cfdg +27 -0
- data/lib/image_paradise/cfdg/star_explosion.cfdg +38 -0
- data/lib/image_paradise/cfdg/star_flower.cfdg +72 -0
- data/lib/image_paradise/cfdg/star_mosaic_2007.cfdg +51 -0
- data/lib/image_paradise/cfdg/starry_pines.cfdg +79 -0
- data/lib/image_paradise/cfdg/stars_tentacles.cfdg +28 -0
- data/lib/image_paradise/cfdg/starshape.cfdg +57 -0
- data/lib/image_paradise/cfdg/strange_antlers.cfdg +49 -0
- data/lib/image_paradise/cfdg/strange_carpet.cfdg +13 -0
- data/lib/image_paradise/cfdg/sunset_city.cfdg +112 -0
- data/lib/image_paradise/cfdg/sweep.cfdg +946 -0
- data/lib/image_paradise/cfdg/swimmers_sperms.cfdg +54 -0
- data/lib/image_paradise/cfdg/sword.cfdg +24 -0
- data/lib/image_paradise/cfdg/tangle.cfdg +25 -0
- data/lib/image_paradise/cfdg/tapestry.cfdg +40 -0
- data/lib/image_paradise/cfdg/tasty_loops.cfdg +97 -0
- data/lib/image_paradise/cfdg/tendril.cfdg +6 -0
- data/lib/image_paradise/cfdg/tentacle_tree.cfdg +57 -0
- data/lib/image_paradise/cfdg/terraforming.cfdg +87 -0
- data/lib/image_paradise/cfdg/test.cfdg +7 -0
- data/lib/image_paradise/cfdg/tetris.cfdg +123 -0
- data/lib/image_paradise/cfdg/textured_giraffes.cfdg +122 -0
- data/lib/image_paradise/cfdg/the_eye.cfdg +16 -0
- data/lib/image_paradise/cfdg/the_go_game.cfdg +81 -0
- data/lib/image_paradise/cfdg/the_secret.cfdg +52 -0
- data/lib/image_paradise/cfdg/the_third_eye.cfdg +42 -0
- data/lib/image_paradise/cfdg/thingy.cfdg +13 -0
- data/lib/image_paradise/cfdg/thorns.cfdg +26 -0
- data/lib/image_paradise/cfdg/too_many_notes.cfdg +155 -0
- data/lib/image_paradise/cfdg/top_down_plant_root.cfdg +43 -0
- data/lib/image_paradise/cfdg/top_view_tree.cfdg +79 -0
- data/lib/image_paradise/cfdg/transparent_heart.cfdg +31 -0
- data/lib/image_paradise/cfdg/tree.cfdg +68 -0
- data/lib/image_paradise/cfdg/tree_number_5.cfdg +28 -0
- data/lib/image_paradise/cfdg/tree_retro.cfdg +46 -0
- data/lib/image_paradise/cfdg/tree_spiral.cfdg +52 -0
- data/lib/image_paradise/cfdg/treematic.cfdg +42 -0
- data/lib/image_paradise/cfdg/tri_arc.cfdg +16 -0
- data/lib/image_paradise/cfdg/tri_squares.cfdg +7 -0
- data/lib/image_paradise/cfdg/tube_map.cfdg +112 -0
- data/lib/image_paradise/cfdg/turing_morphogenesis.cfdg +788 -0
- data/lib/image_paradise/cfdg/twisted_hex_grid.cfdg +26 -0
- data/lib/image_paradise/cfdg/twisty_triangel.cfdg +79 -0
- data/lib/image_paradise/cfdg/twizeeded.cfdg +19 -0
- data/lib/image_paradise/cfdg/uncontrolled_fungus.cfdg +36 -0
- data/lib/image_paradise/cfdg/underground.cfdg +72 -0
- data/lib/image_paradise/cfdg/underwater.cfdg +75 -0
- data/lib/image_paradise/cfdg/unicorn_boi.cfdg +20 -0
- data/lib/image_paradise/cfdg/unification_sign.cfdg +52 -0
- data/lib/image_paradise/cfdg/urban_connections.cfdg +44 -0
- data/lib/image_paradise/cfdg/us_flag.cfdg +109 -0
- data/lib/image_paradise/cfdg/v_null.cfdg +89 -0
- data/lib/image_paradise/cfdg/very_simple_flower.cfdg +45 -0
- data/lib/image_paradise/cfdg/very_simple_hexagon.cfdg +16 -0
- data/lib/image_paradise/cfdg/very_simple_octagon.cfg +13 -0
- data/lib/image_paradise/cfdg/vigorous_vine.cfdg +45 -0
- data/lib/image_paradise/cfdg/ville_topview.cfdg +70 -0
- data/lib/image_paradise/cfdg/vine.cfdg +176 -0
- data/lib/image_paradise/cfdg/vinyl.cfdg +12 -0
- data/lib/image_paradise/cfdg/violet_ribbons.cfdg +45 -0
- data/lib/image_paradise/cfdg/voronoi_2.cfdg +61 -0
- data/lib/image_paradise/cfdg/wald.cfdg +46 -0
- data/lib/image_paradise/cfdg/water_ink.cfdg +71 -0
- data/lib/image_paradise/cfdg/water_monster.cfdg +33 -0
- data/lib/image_paradise/cfdg/web.cfdg +53 -0
- data/lib/image_paradise/cfdg/weighting_demo.cfdg +16 -0
- data/lib/image_paradise/cfdg/weird_spots.cfdg +15 -0
- data/lib/image_paradise/cfdg/welcome.cfdg +109 -0
- data/lib/image_paradise/cfdg/where_do_you_want_to_go_today.cfdg +632 -0
- data/lib/image_paradise/cfdg/where_is_the_head.cfdg +28 -0
- data/lib/image_paradise/cfdg/where_to_go.cfdg +62 -0
- data/lib/image_paradise/cfdg/willow.cfdg +39 -0
- data/lib/image_paradise/cfdg/witch_poison.cfdg +58 -0
- data/lib/image_paradise/cfdg/wooden_floor.cfdg +95 -0
- data/lib/image_paradise/cfdg/writhing.cfdg +15 -0
- data/lib/image_paradise/cfdg/wrooom_cars.cfdg +124 -0
- data/lib/image_paradise/cfdg/xmas_code.cfdg +101 -0
- data/lib/image_paradise/cfdg/xmas_tree.cfdg +70 -0
- data/lib/image_paradise/cfdg/yellow_cactus.cfdg +52 -0
- data/lib/image_paradise/cfdg/yet_another_explosion.cfdg +46 -0
- data/lib/image_paradise/cfdg/yin_yang_taijitu_pattern.cfdg +44 -0
- data/lib/image_paradise/cfdg/yog.cfdg +27 -0
- data/lib/image_paradise/cfdg/yurbanis_m.cfdg +27 -0
- data/lib/image_paradise/cfdg/zen_tree.cfdg +79 -0
- data/lib/image_paradise/cfdg/ziggy_flowers.cfdg +44 -0
- data/lib/image_paradise/cfdg/zodiac.cfdg +43 -0
- data/lib/image_paradise/chunky_png/chunky_png.rb +54 -0
- data/lib/image_paradise/colours/colours.rb +46 -0
- data/lib/image_paradise/confree_generator/confree_generator.rb +791 -0
- data/lib/image_paradise/confree_generator/constants.rb +93 -0
- data/lib/image_paradise/constants/constants.rb +50 -0
- data/lib/image_paradise/constants/image_file_types.rb +26 -0
- data/lib/image_paradise/crop/crop.rb +429 -0
- data/lib/image_paradise/gm_support.rb +34 -0
- data/lib/image_paradise/graphs/accumulator_bar.rb +29 -0
- data/lib/image_paradise/graphs/area.rb +64 -0
- data/lib/image_paradise/graphs/bar.rb +117 -0
- data/lib/image_paradise/graphs/bar_conversion.rb +53 -0
- data/lib/image_paradise/graphs/base.rb +1392 -0
- data/lib/image_paradise/graphs/bezier.rb +45 -0
- data/lib/image_paradise/graphs/bullet.rb +115 -0
- data/lib/image_paradise/graphs/deprecated.rb +42 -0
- data/lib/image_paradise/graphs/dot.rb +129 -0
- data/lib/image_paradise/graphs/line.rb +328 -0
- data/lib/image_paradise/graphs/mini/bar.rb +42 -0
- data/lib/image_paradise/graphs/mini/legend.rb +109 -0
- data/lib/image_paradise/graphs/mini/pie.rb +42 -0
- data/lib/image_paradise/graphs/mini/side_bar.rb +41 -0
- data/lib/image_paradise/graphs/net.rb +133 -0
- data/lib/image_paradise/graphs/photo_bar.rb +106 -0
- data/lib/image_paradise/graphs/pie.rb +139 -0
- data/lib/image_paradise/graphs/scatter.rb +264 -0
- data/lib/image_paradise/graphs/scene.rb +216 -0
- data/lib/image_paradise/graphs/side_bar.rb +144 -0
- data/lib/image_paradise/graphs/side_stacked_bar.rb +116 -0
- data/lib/image_paradise/graphs/spider.rb +163 -0
- data/lib/image_paradise/graphs/stacked_area.rb +73 -0
- data/lib/image_paradise/graphs/stacked_bar.rb +68 -0
- data/lib/image_paradise/graphs/stacked_mixin.rb +30 -0
- data/lib/image_paradise/graphs/themes.rb +117 -0
- data/lib/image_paradise/graphs.rb +36 -0
- data/lib/image_paradise/graphviz/README.md +2 -0
- data/lib/image_paradise/graphviz/generate_graphviz_image.rb +276 -0
- data/lib/image_paradise/gui/gtk3/cfdg_widget/cfdg_widget.rb +1452 -0
- data/lib/image_paradise/gui/gtk3/cfdg_widget/connect_skeleton.rb +46 -0
- data/lib/image_paradise/gui/gtk3/image_editor/connect_skeleton.rb +126 -0
- data/lib/image_paradise/gui/gtk3/image_editor/image_editor.rb +2003 -0
- data/lib/image_paradise/identify.rb +184 -0
- data/lib/image_paradise/image_paradise.rb +153 -0
- data/lib/image_paradise/image_to_ascii/image_to_ascii.rb +187 -0
- data/lib/image_paradise/image_to_pdf/image_to_pdf.rb +99 -0
- data/lib/image_paradise/label/README.md +2 -0
- data/lib/image_paradise/label/simple_label.rb +206 -0
- data/lib/image_paradise/logo/IMGUR_LOGO.png +0 -0
- data/lib/image_paradise/project/project.rb +30 -0
- data/lib/image_paradise/requires/common_base_requires.rb +17 -0
- data/lib/image_paradise/requires/require_colours.rb +9 -0
- data/lib/image_paradise/requires/require_gtk_components.rb +8 -0
- data/lib/image_paradise/requires/require_image_to_ascii.rb +7 -0
- data/lib/image_paradise/requires/require_the_image_paradise_project.rb +42 -0
- data/lib/image_paradise/requires/require_toplevel_methods.rb +21 -0
- data/lib/image_paradise/rotate/README.md +2 -0
- data/lib/image_paradise/rotate/rotate.rb +124 -0
- data/lib/image_paradise/shell/interactive.rb +156 -0
- data/lib/image_paradise/svg/README.md +5 -0
- data/lib/image_paradise/svg/circle.rb +106 -0
- data/lib/image_paradise/svg/feature.rb +48 -0
- data/lib/image_paradise/svg/rectangle.rb +154 -0
- data/lib/image_paradise/svg/svg.rb +102 -0
- data/lib/image_paradise/toplevel_methods/add_black_border_to_this_image.rb +94 -0
- data/lib/image_paradise/toplevel_methods/create_animated_gif.rb +49 -0
- data/lib/image_paradise/toplevel_methods/crop.rb +29 -0
- data/lib/image_paradise/toplevel_methods/e.rb +16 -0
- data/lib/image_paradise/toplevel_methods/esystem.rb +19 -0
- data/lib/image_paradise/toplevel_methods/extract_text_from_this_image.rb +56 -0
- data/lib/image_paradise/toplevel_methods/file_related_code.rb +48 -0
- data/lib/image_paradise/toplevel_methods/flip_image_left_right.rb +59 -0
- data/lib/image_paradise/toplevel_methods/font_related_methods.rb +62 -0
- data/lib/image_paradise/toplevel_methods/greyscale_this_image.rb +76 -0
- data/lib/image_paradise/toplevel_methods/gui.rb +19 -0
- data/lib/image_paradise/toplevel_methods/help.rb +30 -0
- data/lib/image_paradise/toplevel_methods/interlace.rb +33 -0
- data/lib/image_paradise/toplevel_methods/is_an_image_file.rb +18 -0
- data/lib/image_paradise/toplevel_methods/make_this_image_transparent.rb +40 -0
- data/lib/image_paradise/toplevel_methods/menu.rb +110 -0
- data/lib/image_paradise/toplevel_methods/merge_these_images.rb +49 -0
- data/lib/image_paradise/toplevel_methods/mirror_image.rb +28 -0
- data/lib/image_paradise/toplevel_methods/misc.rb +1407 -0
- data/lib/image_paradise/toplevel_methods/negate.rb +36 -0
- data/lib/image_paradise/toplevel_methods/png_to_svg.rb +38 -0
- data/lib/image_paradise/toplevel_methods/quality.rb +34 -0
- data/lib/image_paradise/toplevel_methods/resized.rb +43 -0
- data/lib/image_paradise/toplevel_methods/roebe.rb +323 -0
- data/lib/image_paradise/toplevel_methods/thumbnail.rb +54 -0
- data/lib/image_paradise/toplevel_methods/to_png.rb +106 -0
- data/lib/image_paradise/toplevel_methods/wallpaper.rb +51 -0
- data/lib/image_paradise/toplevel_methods/write_this_text.rb +89 -0
- data/lib/image_paradise/utility_scripts/black_white.rb +92 -0
- data/lib/image_paradise/utility_scripts/create_new_image.rb +110 -0
- data/lib/image_paradise/utility_scripts/image_border.rb +226 -0
- data/lib/image_paradise/utility_scripts/image_gallery/image_gallery.rb +283 -0
- data/lib/image_paradise/utility_scripts/image_manipulations.rb +316 -0
- data/lib/image_paradise/utility_scripts/magic_card_border.rb +215 -0
- data/lib/image_paradise/utility_scripts/optimizer.rb +452 -0
- data/lib/image_paradise/utility_scripts/random_text_to_image.rb +364 -0
- data/lib/image_paradise/utility_scripts/text_on_image.rb +311 -0
- data/lib/image_paradise/utility_scripts/to_gif.rb +93 -0
- data/lib/image_paradise/utility_scripts/to_jpg.rb +82 -0
- data/lib/image_paradise/version/version.rb +19 -0
- data/lib/image_paradise/www/cfdg.cgi +25 -0
- data/lib/image_paradise/www/imagemagick/imagemagick.cgi +266 -0
- data/lib/image_paradise/yaml/README.md +2 -0
- data/lib/image_paradise/yaml/arc.yml +0 -0
- data/lib/image_paradise/yaml/circle.yml +6 -0
- data/lib/image_paradise/yaml/rectangle.yml +6 -0
- data/lib/image_paradise.rb +5 -0
- data/test/16x16_red_square_image_for_testing.png +0 -0
- data/test/misc/README.md +3 -0
- data/test/misc/testing_filling_up_with_circles.rb +65 -0
- data/test/testing_confree_generator.rb +8 -0
- data/test/testing_crop.rb +19 -0
- data/test/testing_image_magick_commands.rb +39 -0
- data/test/testing_image_paradise.rb +49 -0
- data/test/testing_the_svg_component.html +261 -0
- data/test/testing_the_svg_component.rb +106 -0
- metadata +760 -0
data/README.md
ADDED
|
@@ -0,0 +1,928 @@
|
|
|
1
|
+
[](https://www.gobolinux.org/)
|
|
2
|
+
[](https://www.ruby-lang.org/en/)
|
|
3
|
+
[](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">20.02.2023</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">10:06:11</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
|
+
convert -resize 42x148 input.jpg output.jpg
|
|
452
|
+
|
|
453
|
+
But to not have the user enter the output name (or perhaps
|
|
454
|
+
still do hmm).
|
|
455
|
+
|
|
456
|
+
- Add a way to specify which lines are to be drawn via a
|
|
457
|
+
script. That way we can use it to automatically draw or
|
|
458
|
+
re-draw specific images as-is. The idea would be that we
|
|
459
|
+
could programmatically generate any image possible, but
|
|
460
|
+
this will probably require changes to the commandline
|
|
461
|
+
version first, before expanding this onto the GUI.
|
|
462
|
+
|
|
463
|
+
## Blur effects via ImageParadise.blur()
|
|
464
|
+
|
|
465
|
+
You can use the following API for blur-effects:
|
|
466
|
+
|
|
467
|
+
ImageParadise.blur
|
|
468
|
+
ImageParadise.blur('foo.png')
|
|
469
|
+
ImageParadise.blur('foo.png', 5)
|
|
470
|
+
ImageParadise.blur('foo.png', 50)
|
|
471
|
+
|
|
472
|
+
These will modify an image, aka **blur** it. The second argument
|
|
473
|
+
is the radius for the blur operation to use. This functionality
|
|
474
|
+
depends on ImageMagick being installed on the host computer
|
|
475
|
+
system in use.
|
|
476
|
+
|
|
477
|
+
## Changing the quality of an image
|
|
478
|
+
|
|
479
|
+
Via **ImageMagick** you can use this command to change the quality
|
|
480
|
+
of an image:
|
|
481
|
+
|
|
482
|
+
convert -quality 10% input.jpg output.jpg
|
|
483
|
+
|
|
484
|
+
Via ruby and the image_paradise project, you can use this API:
|
|
485
|
+
|
|
486
|
+
ImageParadise.quality('input.jpg',10,'output.jpg'
|
|
487
|
+
|
|
488
|
+
Be careful when you have .jpg files; from experience I see **a
|
|
489
|
+
lot of deterioration** in regards to quality if you have to do
|
|
490
|
+
many operations again and again. In this case, you may be
|
|
491
|
+
better off converting into .png, then modifying the .png,
|
|
492
|
+
before then converting it back into .jpg again. Note that
|
|
493
|
+
this also causes loss in quality usually, but you have only
|
|
494
|
+
two conversion steps, whereas if you, say, have to do 10
|
|
495
|
+
operations on the .jpg, drawing stuff on the canvas, this
|
|
496
|
+
may lead to worse image quality if you started with a .jpg
|
|
497
|
+
file and keep on working with it.
|
|
498
|
+
|
|
499
|
+
Even a one-time saving to .jpg may impact its quality
|
|
500
|
+
negatively, depending on the chosen quality. As a rule of
|
|
501
|
+
thumb, if I want to maintain some useful quality in a
|
|
502
|
+
given image, I don't go below the 84% quality threshold
|
|
503
|
+
for .jpg files. In the long run, though, I will probably
|
|
504
|
+
switch to a better format when it comes to lossy
|
|
505
|
+
encoding, perhaps WebP - we'll see.
|
|
506
|
+
|
|
507
|
+
## Rotating an image
|
|
508
|
+
|
|
509
|
+
(Technically this is similar to flip-flop, but I added this functionality
|
|
510
|
+
at a later point, so the flip-flop subsection here shall remain for the
|
|
511
|
+
time being.)
|
|
512
|
+
|
|
513
|
+
The commandline API for rotating an image called **FOOBAR.png**, in
|
|
514
|
+
regards to image_paradise, may go so:
|
|
515
|
+
|
|
516
|
+
imgparadise FOOBAR.png --rotate=33%
|
|
517
|
+
imgparadise foo.png --rotate=90%
|
|
518
|
+
imgparadise *.png --rotate=90%
|
|
519
|
+
|
|
520
|
+
Simply pass the rotation-value that you wish to use into --rotate.
|
|
521
|
+
|
|
522
|
+
Be careful, though - this command will overwrite the image, so **make
|
|
523
|
+
sure to backup your old image** before applying this command.
|
|
524
|
+
|
|
525
|
+
Sometimes you may dislike the background colour used, after having
|
|
526
|
+
applied a rotate-effect. In this case, recall that you can specify
|
|
527
|
+
the background color via **-background red** or another name.
|
|
528
|
+
(This may be integrated into the ruby-gtk3 wrapper, but it is
|
|
529
|
+
currently, in May 2021, not added.)
|
|
530
|
+
|
|
531
|
+
## The difference between the fill colour and the stroke colour
|
|
532
|
+
|
|
533
|
+
<b>Fill colour</b>:
|
|
534
|
+
|
|
535
|
+
- It fills objects with that colour. So a fill colour of red,
|
|
536
|
+
will paint the object's content, such as a circle in red too.
|
|
537
|
+
You thus get a red circle.
|
|
538
|
+
|
|
539
|
+
<b>Stroke colour</b>:
|
|
540
|
+
|
|
541
|
+
- This colour draws the outline of an object. In other words,
|
|
542
|
+
it will specify a border.
|
|
543
|
+
|
|
544
|
+
## Table of some ImageMagick commands
|
|
545
|
+
|
|
546
|
+
I did not want to google all the time, so here is just a short
|
|
547
|
+
memo for me which options exist in ImageMagick. This is currently
|
|
548
|
+
very incomplete; in the future I may extend this list.
|
|
549
|
+
|
|
550
|
+
-pointsize 24 # specify the width of the drawling
|
|
551
|
+
-stroke red # use red as the colour for the paint-stroke to be done
|
|
552
|
+
-fill red # this is the fill colour, aka the content of an object
|
|
553
|
+
-strokewidth 3 # set the width, in px, of the paint-stroke action
|
|
554
|
+
-linewidth 5 # the width of the line, when drawing a line
|
|
555
|
+
-font Arbuckle.ttf # use this font; you can specify a local file path too, to a .ttf file
|
|
556
|
+
-annotate 45x0+10+30 # Annotate via 45° angle
|
|
557
|
+
|
|
558
|
+
Because I may re-use the -font option in particular, here is a variant
|
|
559
|
+
that I use:
|
|
560
|
+
|
|
561
|
+
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
|
|
562
|
+
|
|
563
|
+
ImageMagick itself supports at the very least **TrueType fonts**,
|
|
564
|
+
**PostScript** and **OPTION1** fonts.
|
|
565
|
+
|
|
566
|
+
## Borders
|
|
567
|
+
|
|
568
|
+
This subsection explains some general stuff about borders. In this
|
|
569
|
+
context a **border** means an area around an image, such as a
|
|
570
|
+
black border around an image that has a width of 3 pixels (px).
|
|
571
|
+
|
|
572
|
+
You can add some borders to images thanks to **ImageMagick**. The
|
|
573
|
+
**image_paradise** gem supports this as well, to some extent.
|
|
574
|
+
|
|
575
|
+
The toplevel method **ImageParadise.add_black_border_to_this_image()**
|
|
576
|
+
can be used to add a black border to an image. It is a very simple
|
|
577
|
+
method. The first argument to this method is the path to the image
|
|
578
|
+
at hand. The second argument specifies the size of the border,
|
|
579
|
+
in **pixels**. So, if you pass the number **3** as second argument
|
|
580
|
+
then this would mean to draw a border 3 pixel wide around the
|
|
581
|
+
image at hand.
|
|
582
|
+
|
|
583
|
+
Invocation example for the local image file called **foobar.png**
|
|
584
|
+
follows next - adapt this to your own needs as-is:
|
|
585
|
+
|
|
586
|
+
require 'image_paradise/toplevel_methods/add_black_border_to_this_image.rb'
|
|
587
|
+
ImageParadise.add_black_border_to_this_image('foobar.png', 3) # we want the border to have 3 pixels
|
|
588
|
+
|
|
589
|
+
Obviously for this to work, the file must exist locally.
|
|
590
|
+
|
|
591
|
+
It is also possible to add a rounded black border. This can be
|
|
592
|
+
seen in traditional card games, such as **magic the gathering**.
|
|
593
|
+
|
|
594
|
+
If you want to use that, consider making use of the following
|
|
595
|
+
class/file and API:
|
|
596
|
+
|
|
597
|
+
require 'image_paradise/utility_scripts/magic_card_border.rb'
|
|
598
|
+
ImageParadise.:MagicCardBorder.new(ARGV)
|
|
599
|
+
# such as in:
|
|
600
|
+
# ImageParadise.:MagicCardBorder.new('foobar.png')
|
|
601
|
+
|
|
602
|
+
See the --help options for what the class will support.
|
|
603
|
+
|
|
604
|
+
You can alias it to e. g. **magic-rounded** and then
|
|
605
|
+
invoke it via:
|
|
606
|
+
|
|
607
|
+
magic-rounded --size=5
|
|
608
|
+
magic-rounded --size=5 foobar.png
|
|
609
|
+
magic-rounded --size=12 foobar.png
|
|
610
|
+
magic-rounded --size=25 foobar.png
|
|
611
|
+
|
|
612
|
+
The --size parameter determines which size to use, via
|
|
613
|
+
the commandline. I recommend keeping the --size parameter
|
|
614
|
+
fairly small; more than **--size=12** is rarely necessary,
|
|
615
|
+
in my opinion. Better to have a slight black border than
|
|
616
|
+
a huge one - but, either way, this is entirely up to the
|
|
617
|
+
user.
|
|
618
|
+
|
|
619
|
+
## Some toplevel methods explained
|
|
620
|
+
|
|
621
|
+
The method **ImageParadise.default_colour?** will give back
|
|
622
|
+
the default colour for the project, if it has been assigned.
|
|
623
|
+
I needed this because some image-related operations require
|
|
624
|
+
a colour, and being able to omit this for subsequent use
|
|
625
|
+
can be convenient, aka set the colour once, and then
|
|
626
|
+
continue to work from there.
|
|
627
|
+
|
|
628
|
+
## API consideration
|
|
629
|
+
|
|
630
|
+
This subsection shows a few syntax examples how I plan to
|
|
631
|
+
rewrite the project in **2022**.
|
|
632
|
+
|
|
633
|
+
Write the text "Hello world" on the image **FOOBAR.png**:
|
|
634
|
+
|
|
635
|
+
textonimage FOOBAR.png --text="Hello world" --colour=darkgreen --font-size=22 --position=3,4
|
|
636
|
+
|
|
637
|
+
This will be passed to class **ImageParadise::TextOnImage**,
|
|
638
|
+
where **ipa** is an alias I use towards
|
|
639
|
+
**bin/image_paradise**. I intend to improve this
|
|
640
|
+
class over the coming weeks.
|
|
641
|
+
|
|
642
|
+
An even simpler variant follows for a closely related
|
|
643
|
+
script, at **bin/img_text**:
|
|
644
|
+
|
|
645
|
+
imgtext what the heck some_file.png --darkblue
|
|
646
|
+
imgtext what the heck some_file.png --tomato # you can pass HTML colours here
|
|
647
|
+
|
|
648
|
+
Why is the example shown above via **imgtext** nice to have?
|
|
649
|
+
|
|
650
|
+
Well - the idea here is that you first think what kind of
|
|
651
|
+
text you want to display on the image. Then, you pass the
|
|
652
|
+
image filename, such as foobar.png. And then you append
|
|
653
|
+
extra commandline flags via -- such as --darkblue.
|
|
654
|
+
|
|
655
|
+
It may be hard to explain why this is useful, but just give
|
|
656
|
+
it a try on some existing image, and play around a bit with
|
|
657
|
+
it. Further options to customise this even more may be
|
|
658
|
+
added in the future.
|
|
659
|
+
|
|
660
|
+
## Which fonts are available for ImageMagick?
|
|
661
|
+
|
|
662
|
+
The answer to this question depends on your computer system.
|
|
663
|
+
|
|
664
|
+
If you are, however had, like me and often forget then
|
|
665
|
+
the following list will contain some font names that
|
|
666
|
+
**may** be available on your linux system too. On Windows
|
|
667
|
+
I do not know whether these are available or not, but
|
|
668
|
+
since Linux is my main operating system I focus primarily
|
|
669
|
+
on Linux.
|
|
670
|
+
|
|
671
|
+
The following list is **not** complete - it just gives a
|
|
672
|
+
few helpful pointers to available names that **may** be
|
|
673
|
+
usable by you.
|
|
674
|
+
|
|
675
|
+
Here we go:
|
|
676
|
+
|
|
677
|
+
AvantGarde, Bookman, Courier, Helvetica, NewCenturySchlbk,
|
|
678
|
+
Palatino, Symbol, Times, Bitstream-Charter, Century-Schoolbook,
|
|
679
|
+
Chandas, Courier, DejaVu-Sans, DejaVu-Serif, Garuda, Hack-Regular,
|
|
680
|
+
Kedage-Normal, Kinnari, Liberation-Mono, Liberation-Sans,
|
|
681
|
+
Liberation-Serif, Loma, Luxi-Mono, Luxi-Sans, Luxi-Serif,
|
|
682
|
+
Mallige-Normal, Nimbus-Mono-L, Nimbus-Roman-No9-L,
|
|
683
|
+
Nimbus-Sans-L, NimbusMonoPS-Regular, NimbusSans-Bold,
|
|
684
|
+
Norasi-Bold, Noto-Mono, Noto-Serif-Bold, Oxygen-Mono,
|
|
685
|
+
Terminus-Regular, Umpush, URW-Gothic-L-Book, Utopia.
|
|
686
|
+
|
|
687
|
+
## Embedding the filename into an image file
|
|
688
|
+
|
|
689
|
+
You can embed the filename (or any other text) into images
|
|
690
|
+
via **imagemagick**. In <b>April 2022</b>, I had a use
|
|
691
|
+
case where I needed to put down the name of the image
|
|
692
|
+
file into the image itself.
|
|
693
|
+
|
|
694
|
+
The syntax from the commandline looks as follows:
|
|
695
|
+
|
|
696
|
+
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
|
|
697
|
+
convert TANA* -font Luxi-Mono -pointsize 32 -draw "gravity northwest fill white text 0,15 'Filename' " output.jpg
|
|
698
|
+
|
|
699
|
+
I wanted to automate this, though, so the following API
|
|
700
|
+
was added to the ImageParadise gem:
|
|
701
|
+
|
|
702
|
+
ImageParadise.embed_the_filename_into_this_image()
|
|
703
|
+
ImageParadise.embed_the_filename_into_this_image('name_of_the_image_file_goes_here.jpg')
|
|
704
|
+
|
|
705
|
+
This is not very customizable though as I just use it
|
|
706
|
+
for hardcoded values mostly. You may have to adjust it
|
|
707
|
+
to your own use case; at the least the method exists,
|
|
708
|
+
so you can modify it as-is. The second argument is a
|
|
709
|
+
Hash which allows for some modifications.
|
|
710
|
+
|
|
711
|
+
For instance, a larger text size can be done via:
|
|
712
|
+
|
|
713
|
+
ImageParadise.embed_the_filename_into_this_image('foobar.jpg', { font_size: 50 })
|
|
714
|
+
|
|
715
|
+
To combine this with a different colour use:
|
|
716
|
+
|
|
717
|
+
ImageParadise.embed_the_filename_into_this_image('foobar.jpg', { font_size: 50, colour_to_use: :tomato }) # You can use the HTML colours here.
|
|
718
|
+
|
|
719
|
+
Note that you can also pass a directory as the first
|
|
720
|
+
argument. So, rather than pass 'foobar.jpg', you
|
|
721
|
+
could pass '/foo/bar/' and the method will gather all
|
|
722
|
+
.gif, .jpg and .png files there, then work on these
|
|
723
|
+
one after the other. This allows us to batch-process
|
|
724
|
+
whole directories containing images. Don't forget
|
|
725
|
+
to keep a backup of these images **before** calling
|
|
726
|
+
this method, though!
|
|
727
|
+
|
|
728
|
+
Usage example:
|
|
729
|
+
|
|
730
|
+
ImageParadise.embed_the_filename_into_this_image('/foo/bar/')
|
|
731
|
+
|
|
732
|
+
## Determining whether a given file is an animated image
|
|
733
|
+
|
|
734
|
+
The following functionality depends on ImageMagick.
|
|
735
|
+
|
|
736
|
+
To determine whether an image is animated you can use the following
|
|
737
|
+
API:
|
|
738
|
+
|
|
739
|
+
ImageParadise.is_this_image_animated?('/foobar.gif') # => true
|
|
740
|
+
ImageParadise.is_this_image_animated?("TANAKA.jpg") # => false
|
|
741
|
+
|
|
742
|
+
## Determining whether a given file is an image file or whether it is not
|
|
743
|
+
|
|
744
|
+
You can use the following API to determine whether the given file is an
|
|
745
|
+
image file or whether it is not.
|
|
746
|
+
|
|
747
|
+
ImageParadise.is_an_image_file?()
|
|
748
|
+
ImageParadise.is_an_image?()
|
|
749
|
+
|
|
750
|
+
Both variants work fine. The second is a bit shorter, so let's look at a
|
|
751
|
+
specific example:
|
|
752
|
+
|
|
753
|
+
ImageParadise.is_an_image?('/tmp/cat.png')
|
|
754
|
+
ImageParadise.is_an_image?('/tmp/dog.gif')
|
|
755
|
+
ImageParadise.is_an_image?('/tmp/deer.bmp')
|
|
756
|
+
|
|
757
|
+
This will return true if it is an image, and false otherwise. Presently
|
|
758
|
+
(in 2022) this works via a constant where the file types are registered,
|
|
759
|
+
e. g. ".png" or ".jpg" all are files. In the future another method may
|
|
760
|
+
be added that uses either "file" to identify the file at hand, or another
|
|
761
|
+
variant by probing the content to determine whether this is really a file
|
|
762
|
+
or not. But currently no such API exists. If it will be added then it
|
|
763
|
+
will probably have another name, so for the time being
|
|
764
|
+
<b>ImageParadise.is_an_image?()</b> should suffice.
|
|
765
|
+
|
|
766
|
+
## Support for chunky_png and examples using chunky_png
|
|
767
|
+
|
|
768
|
+
ChunkyPNG is a ruby-only library that helps the user create
|
|
769
|
+
.png files or read from existing .png files. It is super-convenient
|
|
770
|
+
to use, in many ways even easier to use than ImageMagick. On the
|
|
771
|
+
other hand, a lot of the functionality that ChunkPNG offers can
|
|
772
|
+
be used via ImageMagick. So perhaps ImageMagick is better.
|
|
773
|
+
|
|
774
|
+
Still - as ChunkyPNG exists, I decided to add support to it within
|
|
775
|
+
the namespace called <b>ImageParadise::ChunkyPNG</b>. This may
|
|
776
|
+
be a bit hackish, and support will not be complete, but just more
|
|
777
|
+
of an example what can be done via ChunkyPNG.
|
|
778
|
+
|
|
779
|
+
This subsection will list some examples.
|
|
780
|
+
|
|
781
|
+
To combine two .png files, and overlay one onto the other,
|
|
782
|
+
use:
|
|
783
|
+
|
|
784
|
+
ImageParadise::ChunkyPNG.overlay('Leeann_Tweeden.png','Cute_Biker.png', :center)
|
|
785
|
+
|
|
786
|
+
## Support via Pango
|
|
787
|
+
|
|
788
|
+
ImageMagick knows how to use Pango.
|
|
789
|
+
|
|
790
|
+
Consider the following commandline examples:
|
|
791
|
+
|
|
792
|
+
convert -size 600x100 -gravity center -pointsize 48 pango:"The <span foreground='blue'>blue</span> word." output.png
|
|
793
|
+
convert -size 400x200 -gravity center -background khaki -pointsize 30 pango:"<i>A</i> ⊛ <i>B</i> ⇒ <i>C</i>" chars.png
|
|
794
|
+
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
|
|
795
|
+
|
|
796
|
+
## Resizing an image
|
|
797
|
+
|
|
798
|
+
Images (in 2D) typically have a width and a height setting, such
|
|
799
|
+
as 400px width and 300 px height. This is typically denoted like
|
|
800
|
+
this: 400x300.
|
|
801
|
+
|
|
802
|
+
Naturally you may want to resize an image eventually, for instance,
|
|
803
|
+
by showing it on a webpage. Size often matters here, due to the
|
|
804
|
+
data volume passed to the recipient.
|
|
805
|
+
|
|
806
|
+
ImageMagick allows you to resize an image like this, via the
|
|
807
|
+
commandline:
|
|
808
|
+
|
|
809
|
+
convert -resize 40% foobar.jpg output.jpg
|
|
810
|
+
|
|
811
|
+
This worked if you then use identify to check the width and
|
|
812
|
+
height:
|
|
813
|
+
|
|
814
|
+
identify foobar.jpg
|
|
815
|
+
|
|
816
|
+
Result: foobar.jpg JPEG 280x499 280x499+0+0 8-bit sRGB 32644B 0.000u 0:00.000
|
|
817
|
+
|
|
818
|
+
identify output.jpg
|
|
819
|
+
|
|
820
|
+
Result output.jpg JPEG 112x200 112x200+0+0 8-bit sRGB 8141B 0.000u 0:00.000
|
|
821
|
+
|
|
822
|
+
So, if you multiply 280.0 * 0.4 you get 112.0, which is precisely the width
|
|
823
|
+
value that the file <b>output.jpg</b> has.
|
|
824
|
+
|
|
825
|
+
I wanted an API in ruby that would allow me to do the same:
|
|
826
|
+
|
|
827
|
+
shrink foobar.jpg 40%
|
|
828
|
+
|
|
829
|
+
on the commandline. However had, I realised that I may want to omit
|
|
830
|
+
the <b>trailing %</b> specifically, or even omit the last part
|
|
831
|
+
altogether, thus only using the following commandline variant:
|
|
832
|
+
|
|
833
|
+
shrink foobar.jpg # the first argument is the locally existing file
|
|
834
|
+
|
|
835
|
+
In that case, <b>shrink</b> will shrink the image down to 75%, thus,
|
|
836
|
+
width and height will be multiplied by a factor of 0.25 to obtain the
|
|
837
|
+
new width and height (rounded down, always, to get integer pixel
|
|
838
|
+
values).
|
|
839
|
+
|
|
840
|
+
If you want to do this from within ruby, you can, after requiring
|
|
841
|
+
the image_paradise gem, use any of the following:
|
|
842
|
+
|
|
843
|
+
ImageParadise.resize_by_percent('foobar.jpg')
|
|
844
|
+
ImageParadise.resize_by_percentage('foobar.jpg')
|
|
845
|
+
ImageParadise.resize_percent('foobar.jpg')
|
|
846
|
+
ImageParadise.percent('foobar.jpg', 20)
|
|
847
|
+
ImageParadise.percent('foobar.jpg', '30')
|
|
848
|
+
ImageParadise.percent('foobar.jpg', '40%')
|
|
849
|
+
|
|
850
|
+
Use whatever variant you prefer here. The first one is the official name;
|
|
851
|
+
I think it is the best to remember. <b>ImageParadise.percent()</b>
|
|
852
|
+
exists mostly in the event that you quickly want to use it
|
|
853
|
+
from within <b>irb</b>.
|
|
854
|
+
|
|
855
|
+
The executable that bundles this functionality into a standalone
|
|
856
|
+
file can be found at <b>bin/resize_by_percent</b>.
|
|
857
|
+
|
|
858
|
+
## Query the width and the height of an image
|
|
859
|
+
|
|
860
|
+
You can use the following method to determine (return) the
|
|
861
|
+
width of an image (in n px, aka n pixels):
|
|
862
|
+
|
|
863
|
+
ImageParadise.width_of_this_image?
|
|
864
|
+
ImageParadise.width_of_this_image?('foobar.png')
|
|
865
|
+
ImageParadise.width_of_this_image? "red_six_sided_die.png"
|
|
866
|
+
|
|
867
|
+
A similar method exists for the height of an image:
|
|
868
|
+
|
|
869
|
+
ImageParadise.height_of_this_image?
|
|
870
|
+
ImageParadise.height_of_this_image?('foobar.png')
|
|
871
|
+
ImageParadise.height_of_this_image? "red_six_sided_die.png"
|
|
872
|
+
|
|
873
|
+
|
|
874
|
+
## Licence
|
|
875
|
+
|
|
876
|
+
The licence for this gem is the MIT licence.
|
|
877
|
+
|
|
878
|
+
Basically the most important part of the MIT licence is that, aside
|
|
879
|
+
from you being able to use the project as you see fit, is the no
|
|
880
|
+
warranty disclaimer to avoid any potential misuse from the use
|
|
881
|
+
of the software at hand.
|
|
882
|
+
|
|
883
|
+
You can read up on this licence here:
|
|
884
|
+
|
|
885
|
+
https://opensource.org/licenses/MIT
|
|
886
|
+
|
|
887
|
+
The usual copyright assignment is:
|
|
888
|
+
|
|
889
|
+
Copyright 2023 Robert Heiler
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
## Contact information and mandatory 2FA coming up in 2022
|
|
894
|
+
|
|
895
|
+
If your creative mind has ideas and specific suggestions to make this gem
|
|
896
|
+
more useful in general, feel free to drop me an email at any time, via:
|
|
897
|
+
|
|
898
|
+
shevy@inbox.lt
|
|
899
|
+
|
|
900
|
+
Before that email I used an email account at Google gmail, but in **2021** I
|
|
901
|
+
decided to slowly abandon gmail, for various reasons. In order to limit the
|
|
902
|
+
explanation here, allow me to just briefly state that I do not feel as if I
|
|
903
|
+
want to promote any Google service anymore when the user becomes the
|
|
904
|
+
product (such as via data collection by upstream services). I feel this is
|
|
905
|
+
a hugely flawed business model.
|
|
906
|
+
|
|
907
|
+
Do keep in mind that responding to emails may take some time, depending on
|
|
908
|
+
the amount of work I may have at that moment.
|
|
909
|
+
|
|
910
|
+
In <b>2022</b> rubygems.org, or rather the corporate overlords who control the
|
|
911
|
+
rubygems.org infrastructure these days, decided to make 2FA mandatory for every
|
|
912
|
+
gem owner eventually: see
|
|
913
|
+
https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
|
|
914
|
+
|
|
915
|
+
Mandatory 2FA will eventually be extended to all rubygems.org developers and
|
|
916
|
+
maintainers. As I can not use 2FA, for reasons I will skip explaining here,
|
|
917
|
+
this means that my projects will eventually be taken over by shopify (or,
|
|
918
|
+
correspondingly, whoever effectively controls the rubygems.org ecosystem).
|
|
919
|
+
At that point, I no longer have any control what is done to my projects
|
|
920
|
+
since shopify (respectively those controlling the gems ecosystem) took away
|
|
921
|
+
control here. Not sure at which point ruby became corporate-controlled -
|
|
922
|
+
that was not the case several years ago.
|
|
923
|
+
|
|
924
|
+
Ruby also only allows 2FA users to participate on the issue tracker these
|
|
925
|
+
days:
|
|
926
|
+
|
|
927
|
+
https://bugs.ruby-lang.org/issues/18800
|
|
928
|
+
|