質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5368閲覧

flask で画像の明度を変換して、そのままダウンロードする

yukkys

総合スコア42

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/21 19:25

前提・実現したいこと

flaskで画像の明るさを変換して、そのままユーザーがダウンロードできるようにしたい

参考URL

Flask サーバに保存せずにファイルをアップロード・ダウンロードする

発生している問題・エラーメッセージ

AttributeError: 'SpooledTemporaryFile' object has no attribute 'point'

下記コードのf.pointが使えないようです。

該当のソースコード

python

1from flask import Flask, request, render_template, send_file 2from PIL import Image 3from io import BytesIO 4from werkzeug.datastructures import FileStorage 5from skimage import io 6 7app = Flask(__name__) 8 9@app.route('/', methods=["GET", "POST"]) 10def index(): 11 title = 'This is Fix Image App!!' 12 13 if request.method == 'GET': 14 return render_template('index.html', title=title) 15 else: 16 f = request.files['file'] 17 img_bright = f.point(lambda x:x*1.8) 18 19 return send_file(img_bright, 20 attachment_filename=f.filename, 21 as_attachment=True) 22 23if __name__ == '__main__': 24 app.run(debug=True)

html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8</head> 9<body> 10 <h1>{{title}}</h1> 11 <img src="/static/images/original_yakiniku.jpg" alt="original"> 1213 <img src="/static/images/fix_yakiniku.jpg" alt=""> 14 15 <form action="/", method="POST", enctype=multipart/form-data> 16 <input type="file", name="file"> 17 <input type="submit"> 18 </form> 19 20</body> 21</html>

試したこと

jupyter上で下記のようなコードを書いてフォルダ内の画像全てを明るくするという処理をしたのですが、これをflaskに転用できないかとそのままコードを使っています。

jupyter

1original_photos = os.listdir("photos") 2count = 1 3 4for p in original_photos: 5 img = Image.open("photos/{}".format(p)) 6 img_bright = img.point(lambda x:x*1.8) 7 ftitle, fext = os.path.splitext(p) 8 img_bright.save("bright/{}.jpg".format(count)) 9 count = count + 1

そして、参考URLのように画像の処理を何も入れずに実装をしてみたのですが、ダウンロードはできるものの、中身が空となってしまいます。

また、
f = request.files['file']
で受け取ったものはimageファイルそのままなのかなと思ってprintしてみたところ、<FileStorage: '1.jpg' ('image/jpeg')>となっていたので違うのかなと思いました。FileStorageとは何でしょうか。ここから画像を明るくする、pointを使えるようにするにはどうしたら良いでしょうか。

補足情報(FW/ツールのバージョンなど)

python 3.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

明度変換ではないですが、実現したい挙動に似たコードを作成してみました。
(なるべく元のコードを変えないように意識しました)

ディレクトリ構造は、以下のようになります。

$ tree . ├── main.py └── templates └── index.html 1 directory, 2 files

main.py

python3

1from flask import Flask, request, render_template, send_file 2from PIL import Image, ImageEnhance 3import io 4 5app = Flask(__name__) 6 7@app.route('/', methods=["GET", "POST"]) 8def index(): 9 title = 'This is Fix Image App!!' 10 11 if request.method == 'GET': 12 return render_template('index.html', title=title) 13 else: 14 f = request.files['file'] 15 buf = io.BytesIO() 16 adjust_contrast(f, buf, 1.7) 17 buf.seek(0) 18 19 return send_file(buf, 20 attachment_filename=f.filename, 21 as_attachment=True) 22 23def adjust_contrast(input_image, output_image, factor): 24 image = Image.open(input_image) 25 enhancer_object = ImageEnhance.Contrast(image) 26 out = enhancer_object.enhance(factor) 27 out.save(output_image, 'JPEG') 28 29if __name__ == '__main__': 30 app.run(debug=True) 31

index.html

html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8</head> 9<body> 10 <h1>{{title}}</h1> 11 12 <form action="/", method="POST", enctype=multipart/form-data> 13 <input type="file", name="file"> 14 <input type="submit"> 15 </form> 16 17</body> 18</html>

実行

以下のように実行してみてください。

python3 main.py

一応、自分の環境では動きました。
フォームから画像アップロード→変換された画像のダウンロード
となります。

デフォルトでは、
http://localhost:5000
でブラウザからアクセスできると思います

注意点など

質問内容を見る限り、質問者さんは、おそらくアップロードされたファイルをファイルシステムに保存したくなかったと予想します。

それを踏まえ、scikit-imageではファイルオブジェクトを入力として簡単に扱えない感じだったので、使うのをやめました。
画像処理としては、PILでコントラストを変更するという程度にとどめています。
(自分はPILにについては、詳しくありません)

また、画像のフォーマットはJPEG固定となっています

何か、質問者さんの気づきにつながれば幸いです。

参考

adjust_contrastの関数は、以下リンクから引用しました
https://www.blog.pythonlibrary.org/2017/10/24/enhancing-photos-with-python/

投稿2018/07/03 13:42

編集2018/07/04 13:32
niciyan2486

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkys

2018/07/04 14:26

ありがとうございます!私の方でも動作確認でき、また明るさ変更もできました! ImageEnhanceも初耳でしたが、画像加工には便利そうですね。 助かりました。また機会がありましたら御助力いただければと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問