あっ,どうも,こんにちは!
最近さくらサーバーで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とか色々できる. ふぅ,長かったなぁ.
コメント