#!/System/Links/ExecutableBinaries/ruby -w # ========================================================== # # Used to draw images. Also called "std_images.rb" # ========================================================== # # std_drawing.rb # ========================================================== # %w( x/STD/std_constants.rb x/STD/std_modules.rb x/STD/std_classes.rb x/STD/std_system.rb x/STD/custom_functions.rb x/STD/std_audio.rb x/STD/std_rpg.rb x/STD/std_colours.rb ).each {|f| require f } # ========================================================== # # Wrapper mostly for RMagick. # StdDrawing # ========================================================== # module StdDrawing include StdSystem include StdColours begin require 'RMagick' require 'rvg/rvg' include Magick rescue Exception => e puts "Error: #{e}" end DEFAULT_CANVAS_WIDTH = 540 DEFAULT_CANVAS_HEIGHT = 540 DCW = DEFAULT_CANVAS_WIDTH DCH = DEFAULT_CANVAS_HEIGHT # For read file DEFAULT_IMAGE_INPUT_LOCATION = '/FOO.png' # For save file DEFAULT_IMAGE_OUTPUT_LOCATION = '/StdDrawing2.png' MIXIN_IMAGE = '/Depot/Images/alien_flower.png' # image to use as test toy # /Depot/Images/ferma.png # Disable this if you need a mixing Image. MIXING_IMAGE = DEFAULT_IMAGE_INPUT_LOCATION # =============================================================== # # === display_image # =============================================================== # def display_image(url=MIXIN_IMAGE) cme "Now displaying #{url}" url = ImageList.new(url) url.display exit end # =============================================================== # # === find_image_center # gives back the image center # =============================================================== # def find_image_center(image) return [ (image.columns/2), (image.rows/2)] end # =============================================================== # # === random_image # Just to get a random image, so that we dont spend too # much time worrying. # StdDrawing::random_image # =============================================================== # def random_image tmp=rand(2) case tmp when 0 return FileListing.get_file_listing(HSS['IMG_RPG']+'/ADOPTION',true).rand when 1 return FileListing.get_file_listing(HSS['IMG']+'/NJOY',true).rand end end # =============================================================== # # === jp2a # shows a jp2a image. # StdDrawing::jp2a # =============================================================== # def jp2a(use_this_image = random_image) my_image = use_this_image the_cmd = 'convert '+my_image+' jpg:- | jp2a -' cme(the_cmd) system(the_cmd) cme('The image above was: ') cme(my_image,CFILE) end # =============================================================== # # === write_image # =============================================================== # def write_image(which_canvas, location) puts "Creating Image at #{location}" which_canvas.write(location) end # ========================================================== # # === fAKE_RESIZING_UNFISHED # hmmm fake temp method # ========================================================== # def fAKE_RESIZING_UNFISHED puts 'You can use the #to_blob method to put the small image in a string.' puts 'tmp = tmp.resize(49,49)' puts 'small_img = tmp.to_blob' puts 'See http://www.simplesystems.org/RMagick/doc/comtasks.html#blob' end # =============================================================== # # === view_image # =============================================================== # def view_image(img) img.display() end # =============================================================== # # === new_image # x = StdDrawing.new_image(40,40,'slateblue') # =============================================================== # def new_image(width=100, height=100, bg_colour=nil) return Image.new(width, height) { self.background_color = bg_colour unless bg_colour.nil? } end # ============================================================ # # This class traverses through HSS['IMG'] and # makes href links. # Invocation Example: # StdDrawing::HtmlCollector.new # ============================================================ # class HtmlCollector include StdSystem include StdColours # ====================================================== # # === initialize # ====================================================== # def initialize @html_string = '' # contains all html info run_it_all end # ====================================================== # # === invert # ====================================================== # def invert(bool_value) bool_value.true? ? false : true end # ====================================================== # # === run_it_all # ====================================================== # def run_it_all # first collect all files Dir.chdir(HSS['IMG']) #@all_files = Dir[HSS['IMG']+'/**'] @all_files = Dir['**/*'] _tmp_array = [] @all_files.reject! do |my_image| #cme("#{my_image} is not an image.") invert(File.is_image?(my_image)) end # Now we can build our huge string. draw_images(@all_files) # And write a html file. write_html_file end # ====================================================== # # === draw_images # Will just store the stuff. # ====================================================== # def draw_images(array) array.each do |my_image| @html_string << '
' @html_string << '' << HSS['IMG'] << '/'<
\n" @html_string << MyHtml.string_link(HSS['IMG']+'/'+my_image, HSS['IMG']+'/'+my_image, 's2em','border-left:3px solid darkred;padding-left:1em','',1 ) # Here we specify a fixed width and height. @html_string << MyHtml.string_img(HSS['IMG']+'/'+my_image,'s2em', 'width:30px;height:25px') @html_string << "
\n" end @html_string << N @html_string << "
A total of: #{array.size} images" @html_string << N end # ====================================================== # # === write_html_file # writes the final html file. # ====================================================== # def write_html_file html_file = '/final.html' cme("Writing to #{html_file}",CII) MyLogger.write_what_to(@html_string,html_file,'w+') cme("Finished writing to #{html_file}",CII) end end # To start the above: # extend self end # =============================================================== # # require 'x/STD/std_drawing.rb';StdDrawing.display_image 'MYSTERIOUS_WOMAN_SMALL.png' # include StdDrawing; # rb $RUBY_STD/std_drawing.rb # # StdDrawing::HtmlCollector.new # =============================================================== # # =============================================================== # # MyRmagick Wrapper # =============================================================== # class MyRmagick include StdDrawing # siehe oben include StdColours attr_my_accessor :image_location # =========================================================== # # === initialize # =========================================================== # def initialize(image_location = MIXIN_IMAGE) @image_location = image_location @main_img = attach_image(@image_location) @gc = Magick::Draw.new set_opacity # display_image @flag_draw_something = false # no idea what this does. end # =========================================================== # # === attach_image # attaches a new image to @main_img, and the location to # @image_location # =========================================================== # def attach_image(this_image) @image_location = this_image return Magick::ImageList.new(this_image) end # =========================================================== # # === clear_image # Set image to nil. # =========================================================== # def clear_image @image_location = '' @main_img = Magick::ImageList.new @main_img.new_image(420,220,Magick::HatchFill.new('white', 'gray90')) end # =========================================================== # # === random_image # wrapper to the above module. # =========================================================== # def random_image StdDrawing.random_image end # =============================================================== # # === draw_rectangle # if make_square is true, we set the height to width, thus # making a square. # StdDrawing.draw_rectangle # =============================================================== # def draw_rectangle( width=200, height=100, top_left_pos = 0, bottom_right_pos = 0, make_square=false ) height = width if make_square gc = Magick::Draw.new gc.stroke( StdColours::HtmlColours::HTML_COLOURS.rand) # colour gc.fill( StdColours::HtmlColours::HTML_COLOURS.rand) modified_coord_x = top_left_pos + width modified_coord_y = bottom_right_pos + width gc.rectangle(top_left_pos, bottom_right_pos,modified_coord_x, modified_coord_y) gc.draw(@main_img) end # =============================================================== # # === mini_rectangle # Makes a 1px x 1px rectangle. mini tag # =============================================================== # def mini_rectangle(how_many_times = 50) cme('Now drawing small rectangle: ') how_many_times.times do draw_rectangle(1+rand(3),1+rand(3),10+rand(155),10+rand(155)) end end # =========================================================== # # === set_opacity # Comment the body if you dont want opacity. # =========================================================== # def set_opacity # @gc.opacity(0.2) end # =========================================================== # # === invoke_test # =========================================================== # def invoke_test @gc.stroke('darkblue') @gc.line(0, 100, 300, 100) @gc.line(0, 100, 500, 500) @gc.rotate(40) @main_img.border!(30, 30, "red") @main_img.rotate(44) end # =========================================================== # # === random_action # Performs a random action. Currently not fully implemented # =========================================================== # def random_action return [multi_line, circle] end # =========================================================== # # === multi_line # draws several lines. Is quite random. # =========================================================== # def multi_line @flag_draw_something = true _ = StdColours::HtmlColours::HTML_COLOURS.rand # array, which should be used randomly. _array = StdColours.random_weighted_colours @gc.stroke(_array.rand) @gc.line(0, 10, 80+rand(400), 180+rand(200)) (1+rand(24)).times do |tmp| _tmp_selection = _array.rand @gc.stroke_width(1+rand(2)) @gc.stroke_opacity(0.1) @gc.stroke(_tmp_selection) @gc.line(0, 40+rand(240), 100+rand(280), 200+rand(400)) end end # =========================================================== # # === get_image_ratio # Gets the ratio of width to height. # Usage Example: # MyRmagick.new(MyRmagick.new.random_image).ratio # =========================================================== # def get_image_ratio(show_debug_info = true) cme("Main img is: #{@image_location}") if show_debug_info return (@main_img.columns.to_f / @main_img.rows.to_f).to_f end alias ratio get_image_ratio # =========================================================== # # === get_image_information # Info tag # =========================================================== # def get_image_information @main_img = Magick::ImageList.new(DEFAULT_IMAGE_INPUT_LOCATION) cme('='*80) puts @main_img.format.to_s + ' Format' puts @main_img.columns.to_s + ' columns' puts @main_img.rows.to_s + ' rows' puts @main_img.class_type.to_s + ' Type' puts @main_img.depth.to_s + ' depth' puts @main_img.number_colors.to_s + ' n colours' puts @main_img.filesize.to_s + ' file size' puts @main_img.x_resolution.to_i.to_s + ' x-res' puts @main_img.y_resolution.to_i.to_s + ' y-res' puts @main_img.units.to_s + ' units' puts @main_img.properties.to_s + ' properties' cme('='*80) end # =============================================================== # # === circle # Draws a circle. # The first args determine the center. # The other two determine a radius point. # =============================================================== # def circle(x=75,y=75,xx=15,yy=33) # @gc.circle(origin_x, origin_y, perim_x, perim_y) -> draw # @gc.circle(x,y,xx,yy) @circle.stroke('tomato') @circle.fill_opacity(0) @circle.stroke_opacity(0.75) @circle.stroke_width(3) @circle.stroke_linecap('round') @circle.stroke_linejoin('round') @circle.ellipse(@main_img.rows/2,@main_img.columns/2, 80, 80, 0, 315) @circle.polyline(180,70, 173,78, 190,78, 191,62) end # =========================================================== # # === annotate # Annotate blabla # =========================================================== # def annotate @gc.annotate(montage, 0,0,0,40, 'Named Colors') { self.font_family = 'Helvetica' self.fill = 'white' self.stroke = 'transparent' self.pointsize = 32 self.font_weight = BoldWeight self.gravity = NorthGravity } end # =========================================================== # # === rpg_filter # This is a filter for use in RPG Maps. You can lay it # over another image. (RPG TAG) # =========================================================== # def rpg_filter cme('Now applying RPG Filter via Vignette.') @main_img = Magick::ImageList.new(DEFAULT_IMAGE_INPUT_LOCATION) max_value = find_image_center(@main_img) _ = (max_value[0]-20+rand(10)) puts "MAX VALUE IS #{max_value[0]} und #{max_value[1]}" # MAX VALUE IS 336 und 340 @main_img = @main_img.vignette(_, _, 20, 10) # rdraw end # =============================================================== # # === default_choice # A general wrapper. # This method will invoke things which are possible. # =============================================================== # def default_choice # get_image_information # multi_line # rpg_filter mini_rectangle end # =============================================================== # # === connect # Mandatory write method. A bottleneck method. IF it is invoked, # then it will create our final image. # Invokes .draw method as well # =============================================================== # def connect @gc.draw(@main_img) if @flag_draw_something # @main_canvas.write('/SQUARE.png') cme("Creating Image at: #{DEFAULT_IMAGE_OUTPUT_LOCATION}") write_image(@main_img, DEFAULT_IMAGE_OUTPUT_LOCATION) end end if __FILE__ == $PROGRAM_NAME # MyRmagick.new.test # MyRmagick.new.circle x=MyRmagick.new x.clear_image #x.default_choice x.mini_rectangle # x=MyRmagick.new # x=MyRmagick.new(true) # x.multi_line # x.default_choice x.connect # very important! # x.jp2a # puts x.random_image #object_traverse_html = StdDrawing::HtmlCollector.new end # rdrawing