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をコピーしました