lib/simple_captcha/image.rb in glebtv-simple_captcha-0.6.1 vs lib/simple_captcha/image.rb in glebtv-simple_captcha-0.6.2

- old
+ new

@@ -8,11 +8,11 @@ 'simply_green' => ['-alpha set', '-fill darkgreen', '-background white', '-size 200x50', 'xc:white'], 'simply_blue' => ['-alpha set', '-fill darkblue', '-background white', '-size 200x50', 'xc:white'], 'red' => ['-alpha set', '-fill \#A5A5A5', '-background \#800E19', '-size 245x60', 'xc:\#800E19'], } - DISTORTIONS = ['low', 'medium', 'high'] + DISTORTIONS = ['none', 'low', 'medium', 'high'] class << self def image_params(key = 'simply_blue') image_keys = @@image_styles.keys @@ -36,10 +36,11 @@ key = key == 'random' ? DISTORTIONS[rand(DISTORTIONS.length)] : DISTORTIONS.include?(key) ? key : 'low' case key.to_s + when 'none' then return [0, 100] when 'low' then return [0 + rand(2), 80 + rand(20)] when 'medium' then return [2 + rand(2), 50 + rand(20)] when 'high' then return [4 + rand(2), 30 + rand(20)] end end @@ -54,10 +55,13 @@ end end end private + def letter_width + SimpleCaptcha.pointsize * 0.7 + end def generate_simple_captcha_image(simple_captcha_key) #:nodoc amplitude, frequency = ImageHelpers.distortion(SimpleCaptcha.distortion) text = Utils::simple_captcha_new_value(simple_captcha_key) if SimpleCaptcha.image_color.nil? @@ -73,20 +77,27 @@ params << "-pointsize #{psz}" end dst = Tempfile.new(RUBY_VERSION < '1.9' ? 'simple_captcha.png' : ['simple_captcha', '.png'], SimpleCaptcha.tmp_path) dst.binmode - text.split(//).each_with_index do |letter, index| - i = -(2 * psz) + (index * 0.7 * psz) + rand(-3..3) - params << "-draw \"translate #{i},#{rand(-3..3)} skewX #{rand(-15..15)} gravity center text 0,0 '#{letter}'\" " + + letters = text.split(//) + text_width = letters.size * letter_width + + letters.each_with_index do |letter, index| + translate = SimpleCaptcha.distortion == 'none' ? '' : "translate #{rand(-3..3)},#{rand(-3..3)} skewX #{rand(-15..15)}" + offset = index * letter_width - ( text_width - letter_width ) / 2 + params << "-draw \"#{translate} gravity center text #{offset},0 '#{letter}'\" " end - params << "-wave #{amplitude}x#{frequency}" + unless SimpleCaptcha.distortion == 'none' + params << "-wave #{amplitude}x#{frequency}" - unless params.join(' ').index('-size').nil? - size = params.join(' ').match '-size (\d+)x(\d+)' - (1..SimpleCaptcha.wave_count).each do |i| - params << "-draw \"polyline #{rand(size[1].to_i)},#{rand(size[2].to_i)} #{rand(size[1].to_i)},#{rand(size[2].to_i)}\"" + unless params.join(' ').index('-size').nil? + size = params.join(' ').match '-size (\d+)x(\d+)' + (1..SimpleCaptcha.wave_count).each do |i| + params << "-draw \"polyline #{rand(size[1].to_i)},#{rand(size[2].to_i)} #{rand(size[1].to_i)},#{rand(size[2].to_i)}\"" + end end end params << "\"#{File.expand_path(dst.path)}\""