Help us understand the problem. What is going on with this article?

Excelで佐々木希を描く with python

More than 1 year has passed since last update.

【環境】

 windows8.1
 Excel 2013
 python2.7
 opencv3

【概要】

 佐々木希の写真から色の情報を取得して、Excelのセルに塗りつぶします。

【フォルダ構成】

 |---sasaki_excel
      |---sasaki_excel.py
      |---sasaki_nozomi.jpg(佐々木希の画像)
      |---sasaki_nozomi.xlsx(描画用のエクセル)

 こちらの画像を使用しました。
 sasaki_nozomi.jpg

【プログラム】

sasaki_excel.py
# -*- coding:utf-8 -*-

import cv2
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

# 画像読み込み
image = cv2.imread("sasaki_nozomi.jpg")

# エクセルファイル読み込み
wb = load_workbook(filename='sasaki_nozomi.xlsx')
# アクティブなシートを取り出す
ws = wb.active

# アスキーコードを使ってアルファベットのリスト作成
# col_name = ['A','B',...,'Z']
col_name = [chr(i) for i in range(65,65+26)]

# エクセルの列名リスト作成
i = 0
for j in xrange(26, len(image[0])):
    # アルファベットの連結
    col_name.append(col_name[i] + col_name[j % 26])
    if (j + 1) % 26 == 0:
        i += 1
    if len(col_name) == len(image[0]):
        break



for gyo in xrange(len(image)):
    for retu in xrange(len(image[gyo])):
        for rgb in xrange(len(image[gyo][retu])):

            # 赤、緑、青の値を16進数へ変換
            # 16進数にすると'0x**'と変換されるため後ろ2文字を取り出す
            red = hex(image[gyo][retu][0])[2:4]
            # 例えば'0xc'と変換される16進数もあるため、0を連結
            if len(red) == 1:
                red = '0' + red
            green = hex(image[gyo][retu][1])[2:4]
            if len(green) == 1:
                green = '0' + green
            blue = hex(image[gyo][retu][2])[2:4]
            if len(blue) == 1:
                blue = '0' + blue

            # 列と行の幅を変更
            ws.column_dimensions[col_name[retu]].width = 0.3
            ws.row_dimensions[retu].height = 1.5

            # 塗りつぶすセル名を取得
            cell_name = col_name[retu] + str(gyo + 1)
            # セル名をセット
            cell = ws[cell_name]
            # 16進数の数字を文字連結
            color = str(blue) + str(green) + str(red)
            # 塗りつぶし
            cell.fill = PatternFill(patternType='solid', fgColor=color)

# エクセルファイル保存
wb.save('sasaki_nozomi.xlsx')

【結果】

sasaki_nozomi.png

決して画像を貼りつけたわけではありませんよ(笑)
セルの幅は手動で調整しました。
[2016.5.29 追記]
セルの幅の調節を手動ではなくプログラムに組み込みました。

このプログラムの応用としては2枚の画像に対してセルの色を比較して、間違い探しをすることができます。

【参考サイト】

 PythonからExcelファイルをいじるopenpyxl
 アスキーコード表

【他言語版】

 Node.js版はこちら
 Ruby版はこちら

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away