터미널에 Gif 애니메이션 표시

8313 단어 Ruby
이 기사를 참고하게 해 주세요.감사합니다.카렌 귀여워!
터미널에 그림 보이기
원본 코드를 기반으로 Gif 애니메이션도 표시할 수 있도록 확장되었습니다.
#!/usr/bin/env ruby

require 'curses'
require 'rmagick'

DOT_CHAR = "  "
IMAGE_PATH = ARGV[0]
INTERVAL = ARGV[1] ? ARGV[1].to_f : nil

def pixel2color_text(pixel)
  color = [pixel.red, pixel.green, pixel.blue].map { |n| (n * 5) / (255 * 255) }
  "\x1b[48;5;#{16 + color[0] * 36 + color[1] * 6 + color[2]}m#{DOT_CHAR}\x1b[0m"
end

def screen_columns
  Curses.init_screen
  columns = Curses.cols / 2
  Curses.close_screen
  columns
end

def draw(image)
  image = image.sample((1.0 * screen_columns) / image.columns)
  rows = (0...image.rows).map do |row|
    pixels = image.get_pixels(0, row, image.columns, 1)
    pixels.map { |pixel| pixel2color_text(pixel) }.join
  end
  picture = rows.join("\n")

  puts picture
end

def animate(image_path)
  image_list = Magick::ImageList.new(image_path)
  # (ImageList#delay から算出した) デフォルトの interval 値でアニメがもっさりする場合は
  # INTERVAL の値を 0.1 などに弄ってみてください。
  interval = INTERVAL || ((1.0 * image_list.delay) / 100)

  image_list.each do |image|
    draw(image)
    sleep(interval)
  end
end

def clear_screen
  puts "\e[H\e[2J"
end

def main
  interrupted = false
  Signal.trap(:INT) { interrupted = true }

  # Ctrl + C で終了します。
  # ※ ただし、現在のアニメーションが最後のコマまで再生されるまでは終了できません。
  until interrupted do
    animate(IMAGE_PATH)
  end

  clear_screen
end

main

데모


スクリーンショット
신난다!✌(’ω’✌ )세 개✌(’ω’)✌셋.✌’ω’)✌

좋은 웹페이지 즐겨찾기