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

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

ただいまの
回答率

89.12%

Webで画像をサーバに保存せずに画像処理、表示する方法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,418

gorgeous

score 13

ユーザーがWebから画像を入力(アップロード)して、サーバーで画像処理を行い、処理後の画像を表示させるウェブページを作成しようとしています。
ですが、ユーザー視点では入力画像をサーバーに保存されると安心して使用していただけないと思います。
そこで、画像を保存せずに、もしくは一時保存で処理、および出力できるかどうか考えています。

画像処理はpythonで行います。
試みた工程は
  1.  htmlで画像の受付
  2.  phpでサーバーへのアップロード
  3.  pythonで画像処理
  4.  phpで表示
です。pythonはphpでpassthruを使って実行し、処理後画像のパスを出力するようにしています。
これでは①pythonに処理させる際に画像のパスが必要なのでアップロードされた画像をサーバーに保存しています。また、②処理後の画像も保存して、そのパスで表示しています。
この2度の保存を行わずに完結させたいと考えています。

アップロードの際に一時保存されるデータでは表示もpythonにおくることもできないことは確認しました。
passthruでは画像を直接出力できるらしいのですが、調べても実際に行っているサイトは見つからなかったので、よくわかりません。

①、②を改善できる方法はありませんか?
よろしくお願いします。

<追加編集1>
pythonで画像処理を行うのが前提となっています。(pythonのプログラムはすでにあります。)
現在の状況を詳しく書くと
HTML5のフォームで画像を受け付け→PHPで画像を保存→PHPのコマンドを実行させる関数でpythonのプログラムを画像のパスを引数に実行し→pythonで処理後画像を保存→PHPで戻り値を使って画像表示
です。
このやり方しか知らないためこの方法で行っています。PHPは必須ではないです。
追加になりますが使用言語制限はHTML5、PHP、JavaScript、pythonです。使う必要がないものは使わなくてもいいのですが、これらの言語だけで完結させたいです。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/06/20 14:30

    画像処理にPythonを使うというのは、Pythonで作られた既存の画像処理ツールがあるということですか?

    キャンセル

  • gorgeous

    2015/06/20 18:54

    申し訳ありません明記しておくべきでした。はい、その通りです。画像処理のプログラムはpythonですでに作られている、または作る予定があります。というよりもpythonで画像処理を行うことが前提なんです。画像処理の部分は絶対pythonでやることになります。
    もちろん入力出力の方法によっては変更を加えます。

    キャンセル

  • Stripe

    2015/06/20 19:05

    「すでに作られている」と「作る予定がある」では意味が180度違いますが、けっきょくのところどっちですか?あと、PHPを使う前提条件もあるんですか?

    キャンセル

  • gorgeous

    2015/06/20 19:18

    言葉足らずでした。すでに作られるものがあります。そして、別の画像処理プログラムも作成中ということです。
    PHPは前提じゃありません。使わなくても大丈夫です。
    HTMLのフォームで受け付けた画像を扱う方法とpythonで画像処理を行ってできた画像を(動的に)表示する方法をPHPでできることしか知らないので使っています。

    キャンセル

回答 4

checkベストアンサー

+1

まず、PHPをやめて、PythonのWebアプリケーションサーバを使ってください。
これで、Pythonの画像処理プログラムを外部プログラムとしてでなく、直接画像処理ルーチンを利用できるようになります。

つぎに、JavaScriptを使って画像のアップロードとダウンロードを同時に行うようにしてください。
HTMLフォームを使って画像をアップロードすると、そのレスポンスはHTMLになってしまうので、画像ファイルをどこかに保存しなければならなくなります。

ちなみに、このような仕組みにすると、ページのリロードで画像が消えますので、注意してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/20 22:56

    わかりやすく丁寧に教えてくださってありがとうございます。
    この方法を参考にして進めていこうと思うのですが、もう一つ確認したいです。
    wwwサーバ?を持っていてそれを使っているのですが、それを使わずにPythonのWebアプリケーションサーバを使うということなのでしょうか?
    (そうでないとpythonとHTML,JavaScriptを紐付できない?)

    キャンセル

  • 2015/06/20 23:18

    PythonのWebアプリケーションサーバには、いろいろなものがあるので、数ある中から最適なものを選択してください。例えば、Apache用のmod_wsgiモジュールとかもありますし、httpサーバと別にWebアプリケーションサーバを立てて、httpサーバでプロキシすることもできます。

    キャンセル

+1

PHP,Pythonどちらかに統一しないとできないですよ。
なぜ、PHP,Python 2つのスクリプト言語を使わなければならないんですか?

また、tmpfsに保存すれば、それほど無駄な処理にはならないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/20 19:03

    回答ありがとうございます。
    そうなんですか。
    明記していませんでしたがpythonを使うことは前提になっています。
    申し訳ありません、pythonのプログラムは私が作成しているわけではなく詳しくないのですが、HTML5にpythonを組み込んで画像の入力受付(フォーム)の処理と画像の表示はできるのでしょうか?

    tmpfsについて調べてみます。ありがとうございます。

    キャンセル

0

UNIXパイプを使うという手はどうでしょうか?
これなら一時ファイルを作ることなくPythonプログラムにバイナリデータを渡して処理させることが出来ます。
PHPは詳しくありませんがproc_openやExpectを使えばできるようです。
Pythonプログラムとの間で標準入出力を使って通信してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/20 19:30

    回答ありがとうございます。
    バイナリデータのことがよくわかっていないことに気付きました。
    画像ファイル(hoge.jpgなど)を入力として画像処理させるのと同様に、バイナリデータを使って画像処理できるのでしょうか?(画像処理のプログラム自体を書きかえる必要があるのか?)
    また、バイナリデータを画像として出力できるのでしょうか?(バイナリデータを画像に復元できるのか?)

    キャンセル

-1

画像をbase64でエンコードする事で、ご希望の動作は実現できないでしょうか?
javascriptで画像をbase64でエンコードできますので、それをphpにpostしてやれば、基本的に文字列での扱いになるので、pythonに引数として渡せるのではないかと。。また逆もしかりです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/20 14:28

    コマンドラインの引数には文字数制限があります。

    キャンセル

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる