パイナップルの芯

プログラムを中心に、オーディオやゲームなど。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

python での画像出力

2012-04-06 00:07:17 | Weblog
暇なので勉強を、ということで ruby とか python とか勉強中。

管理しているサイトがさくらインターネットにあり、ライトプランなのですが、ライトプランでも ruby, python を使えると言うことでいろいろやってます。

やり始める前に比較ページとかいろいろ見ましたが、全部やってみればいいじゃねーか!と思い立ち WEB で使いそうな機能を同じように作ってどうなのよ?というところを検証しようとしています。
速度についてはインタープリターの進化でだいたい同じ所に収束すると勝手に思っているので、使い勝手中心での検証予定。

今日は主な機能を ruby でも python でも実装し終えたので、あとは perl で同じように実装してどうなのか作ったら結果をまとめて公表します。



で、今日書きたいのはPython [2.7] について一つ。

html から post でメッセージ出して、画像だけを出力する機能を試していたのですが、うまくいかない。ちなみに ruby は簡単でした。

よくある
print "Content-Type: text/html\n\n"
のところを image/png\n\n にしてもだめ。
これだけだと http ヘッダーに [なんたらかんたら: chunked] が出力される。Content-Length は無くても動くようですが、せっかくなので入れたい。
で、ファイルサイズ測って content-type の前に print すると今度は MIME が plain/text になってしまう。(以下のような感じ)
print "Content-Length...\n"
print "Content-type...\n\n"

一応何らかのデータは送られてきてはいるようだがうまくいかないので、Wireshark まで使っていろいろ調べました。
(つーかこんなもんまで使わせるなよ……疲れた)

で、最終的にできあがったのがこれ。

import os
stat=os.stat("test.png")
print "Content-Length: "+str(stat.st_size)+"\nContent-Type: image/png\n"
f=open("test.png","rb")
print f.read()
f.close()

ググると dor 関数とか使うものもヒットしますが、これだけで出力できました。

調査の最後の方はいろいろ調べていてあるコードを見たときに2行をまとめることを思い立ち、一行にしました。
ruby で同じことして正常に動く時のパケットと比較しながらいろいろ詰めていき、最終的に最後の \n は一つじゃないといけないということが判明。
0x0a が一つ余計でした。
苦労した割にはあまり使わないコードなのではと今更ながら思ってます。
img src="abc.rb"
とやってカウンターとかダミー画像とか出力する場合に使うくらいか?

とりあえずこれで動いた。Python 3.x 系は不明。
cgi ライブラリでいろいろ出力できる perl や ruby とは大違いだな……。

コメント   この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« WebM 動画と MIME | トップ | Perl, Ruby, Python 比較 »
最新の画像もっと見る

コメントを投稿

Weblog」カテゴリの最新記事