Excelに画像を書くスクリプトを書いた

  • 7
    いいね
  • 0
    コメント

Excelに画像を貼って上司に提出したら、

「画像を張るなんてお客様に失礼だ、温かみが足りない。画像は各セルを塗りつぶして書きなさい。」

なんて言われたときのために画像をExcelに書き込むスクリプトをRubyで書きました。

# coding: utf-8
require 'axlsx'
require 'chunky_png'

# USAGE: ruby scripts/draw_picture_to_excel.rb <input file>
filename = ARGV[0]
image = ChunkyPNG::Image.from_file(filename)
working_image = image.dup

Axlsx::Package.new do |package|
  # create workbook
  package.workbook do |workbook|
    # define styles
    workbook.styles do |style|
      # draw cells
      workbook.add_worksheet(name: "sample") do |sheet|
        row_pix_count = 1
        pix_colors = []
        working_image.pixels.map! do |pixel|
          if image.width == row_pix_count
            # write per image width size
            pix_colors << style.add_style({bg_color: ChunkyPNG::Color.to_hex(pixel, false).sub(/#/, '')})
            sheet.add_row Array.new(image.width, ''), style: pix_colors, sz: 10
            pix_colors = []
            row_pix_count = 1
          else
            # create color style of Axlsx
            pix_colors << style.add_style({bg_color: ChunkyPNG::Color.to_hex(pixel, false).sub(/#/, '')})
            row_pix_count += 1
          end
        end
      end
    end
  end
  # create file
  package.serialize("sample.xlsx")
end

これを実行すると、この画像が

lena_std_res.png

Excel上でこうなります

スクリーンショット 2017-01-04 13.51.24.png

仕組みは単純でRubyからPNG画像を楽に操作するためのchunky_pngを使って、各ピクセルのRGB値を取得し、RubyからExcelを楽に操作するためのaxlsxを使って、そのRGB値でセルを塗りつぶしていくだけです。

ただ全ピクセルをセルに反映するのでメモリをかなり使います。最大でも100x100の画像くらいが表示限界かもしれないです。