画像のurlを受け取りbase64テキストに変換する(Python)

html canvasに画像を描画するとき,画像のURLでも描画ができますが,toDataUrlを呼びそれをbase64形式で出して保存しようとすると,エラーがでます(DOM Exception 18だった気がする) これを回避する一つの方法が,画像のバイナリデータを直接書き込むというものです. このとき,画像のバイナリデータをbase64形式に変換してcanvasに書き込む(drawImage)必要があります. これらの処理をサーバ側(Python)でやるためのモジュール(そんなたいそうなものではない)を書きました. 僕は実際に使っています.
ダウンロードはこちらから.Download

Source

import base64
import requests

def url_to_b64(url):
    return bytes_to_b64(url_to_bytes(url))

def url_to_bytes(url):
    return requests.get(url).content

def bytes_to_b64(bytes):
    if bytes[0] == "\xff" and bytes[1] == "\xd8" and bytes[-2] == "\xff" and bytes[-1] == "\xd9":
        imgsrc = "data:image/jpeg;base64,"
    elif bytes[0] == "\x89" and bytes[1] == "\x50" and bytes[2] == "\x4e" and bytes[3] == "\x47":
        imgsrc = "data:image/png;base64,"
    elif bytes[0] == "\x47" and bytes[1] == "\x49" and bytes[2] == "\x46" and bytes[3] == "\x38":
        imgsrc = "data:image/git;base64,"
    elif bytes[0] == "\x42" and bytes[1] == "\x4d":
        imgsrc = "data:image/bmp;base64,"
    else:
        imgsrc = "data:image/unknown;base64,"
    return imgsrc + base64.b64encode(bytes)

if __name__ == '__main__':
    imgurl = 'http://images.moneysavingexpert.com/images/OrangeLogo.jpg'
    b64_text = url_to_b64(imgurl)
    print b64_text

終わりに

これを使えば,canvasに画像を描画してそれを保存する,といったことができます. 今はこれをクライアント側のみでできないか模索中です.規約とかなんとかで無理っぽそうですが.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中