From: "trans. (T. Onoma)" Date: 2004-12-07T03:56:31+09:00 Subject: Re: Duck images Cool! Did you submit to the contest? On Monday 06 December 2004 06:17 am, Dave Burt wrote: | #!/usr/local/bin/ruby | # Copyright (c) 2000 Brian Fundakowski Feldman | # All rights reserved. | # | # Redistribution and use in source and binary forms, with or without | # modification, are permitted provided that the following conditions | # are met: | # 1. Redistributions of source code must retain the above copyright | # notice, this list of conditions and the following disclaimer. | # 2. Redistributions in binary form must reproduce the above copyright | # notice, this list of conditions and the following disclaimer in the | # documentation and/or other materials provided with the distribution. | # | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE | LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | THE POSSIBILITY OF # SUCH DAMAGE. | # | # $Id: img2ascii.rb,v 1.5 2000/11/01 06:06:14 green Exp green $ | # | # Convert an image into greyscale ASCII art. | # | # usage: img2ascii.rb [-hr] [-w width] [-a aspect] file | | require 'GD' | require 'getopts' | | scrnwidth = 80 | aspect_ratio = 6.0 / 10.0 | | def usage(string = nil) | puts "error: " + string if string | $stderr.puts "usage: #{$0} [-hr] [-w width] [-a aspect] file" | exit 1 | end | | usage("invalid option") if !getopts("hr", "a:", "w:") | if $OPT_w | scrnwidth = $OPT_w.to_i | if scrnwidth <= 1 | usage("bad width") | end | end | if $OPT_a | $OPT_a.gsub(/[[:space:]]/, '') =~ | /^([[:digit:]]+\.?[[:digit:]]*?)(\/([[:digit:]]+\.?[[:digit:]]*))?$/ | usage("bad number") if !$1 || $1.to_f == 0.0 || ($3 && $3.to_f == 0.0) | aspect_ratio = $3 ? ($1.to_f / $3.to_f) : $1.to_f | usage("negative ratio") if aspect_ratio == 0.0 | end | | usage("no file name") if !(name = ARGV.shift) | case name | when /\.jpe?g$/i | img = GD::Image.newFromJpeg(open(name, 'r')) | when /\.png$/i | img = GD::Image.newFromPng(open(name, 'r')) | when /\.xbm$/i | img = GD::Image.newFromXbm(open(name, 'r')) | when /\.xpm$/i | img = GD::Image.newFromXpm(open(name, 'r')) | else | usage("invalid file name") | end | | gradient = | ' .\'`,^:";~-_+<>i!lI?/\|()1{}[]rcvunxzjftLCJUYXZO0Qoahkbdpqwm*WMB8&%$#@' | gradient.reverse! if !$OPT_r | width, height = img.bounds | nwidth = [width, scrnwidth].min | # useful ratios | # xterm: 6x13, netscape
: 6x10
| nheight = (height.to_f * aspect_ratio * (nwidth.to_f / width.to_f)).to_i
| usage("width too small") if nwidth <= 0
| usage("height too small") if nheight <= 0
|
| $stderr.printf("%s: %d x %d, %d colors -> %d x %d\n", name, width, height,
|   img.colorsTotal, nwidth, nheight)
|
| nimg = GD::Image.new(nwidth, nheight)
| img.copyResized(nimg, 0, 0, 0, 0, nwidth, nheight, width, height)
|
| if $OPT_h
|  filters = [[/[[:space:]]*$/, ''], [/&/, '&'], [//, '>'], [/\[/, '['], [/\]/, ']']]
| else
|  filters = [[/[[:space:]]*$/, '']]
| end
|
| (0...nheight).each {|h|
|  line = (0...nwidth).collect {|w|
|   pixcolor = nimg.getPixel(w, h)
|   colors = nimg.red(pixcolor) + nimg.green(pixcolor) + nimg.blue(pixcolor)
|   gradient[((colors.to_f / 765.1) * gradient.size).floor, 1]
|  }.join
|  filters.each {|*r| line.gsub!(r[0], r[1])}
|  puts line
| }