image_paradise 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
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
|
+
[![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">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
|
+
|