htmlからの画像をRGB配列に

あっ,どうも,こんにちは!

最近さくらサーバーでpythonをちょっとずつ使おうとしているのですが,なかなか思うように動きませんね...

これが画像を送信するhtml

<!DOCTYPE html> <html> <head><meta charset="utf-8"/></head> <body> <h1>画像を入れる</h1> <form action="cgi-bin/example.py" method="POST" enctype="multipart/form-data"> <input type="file" name="image" accept="image/jpg"> <input type="submit" value="送信"> </form> </body> </html>
Code language: HTML, XML (xml)
ここまではいいんですけどね,,
送り先のpythonが大問題!大事なところだけ抜粋するとこんな感じ.
import cgi from PIL import Image form = cgi.FieldStorage() img = form.getfirst('image') if img != None: try: image_pil = Image.frombytes('RGB', (250,250),img)
Code language: JavaScript (javascript)
これで実行すると一番最後の行で,
not enough image data
っていうエラーが出た.
一番したの行の画像サイズの数字を50_50に帰るといけた.
image_pil = Image.frombytes('RGB', (50,50),img)
Code language: JavaScript (javascript)

でも50_50だとダメなんだよなぁ...


何度かやっているうちにわかったのは,元画像の画質が大きく関係しているということ.700*700のやつは(100,100)ではできなかったんだけど,1333*1333のやつは(250,250)でできた.

byteの解像度と配列の解像度で何か違うのかな?

しかしながら1150*1150でも(250,250)のやつはできない...解像度じゃないのかなぁ

ひとつ参考になったサイトはこれ

404 Not Found - Qiita - Qiita
これは入力画像をbase64->python配列にしている.
疑問解決にはなっていないが,課題解決にはなってくれそう.
ただcv2を使っている.できればPillowを使って解決したいところ.

解決

base64でエンコードして,デコードした(詳細はよくわかっていない)
発想としては,画像を表示するためにエンコードをしてたのが大きい.
表示されてる画像を使おうっていう考えに至った.
import base64 from io import BytesIO from PIL import Image,ImageO if img != None: after_encode = base64.b64encode(img) after_encode = str(after_encode) after_encode = after_encode.replace("b'","") after_encode = after_encode.replace("'","") image = Image.open(BytesIO(base64.b64decode(after_encode))) #こっからは楽しみ放題 img = image.convert("RGB")
Code language: PHP (php)
こんな感じ.
とりあえず上のコードでは"RGB"に直してるけど,resizeとか色々できる.
ふぅ,長かったなぁ.

コメント

タイトルとURLをコピーしました