qimg : QUERY_STRING image

画像データをエンコードして QUERY_STRING に載せる CGI
http://dame.dyndns.org/misc/qimg/
画像をアップロードすると、エンコードした URI を表示してくれる。以下は生成した例。

http://dame.dyndns.org/misc/qimg/?q=eNrlVAtTU1cQ3hRKiQUKFFvBUpGiAuIoUhkL0osQTHiI
QUgRQS.CopSHTCECGcsNiBjAQURgJlC9UrFoHEURizbWQ3UUhcQniKDxKkoKohTiiym124t_o9_Mnj27
s7vnnO_sbKk0Umw9zWkaAFiHSkSree0yJZZm_CpqLLsCYAbSiJgQ3hQIBJaWlnZ2do6Ojq6urp6enj4.
Pv7._iKRKCIiQiaTrVu3LiUlJTMzMzc3l2EYlUpVWVmpVqsbGho0Gk1LS4tWq7106ZJOp.vu7jYYDIOD
g6Ojo2_evEHEWl_YH2jZGG57TObYkjj7XJpHu3xxh9LvellQT034g4PRTzTxz85sHCfpE5052PMj3i3E
3hLsK8f.Srxfg4Y6fMjio0Z8fBQHTuDT0zh4Fo2_49BFHO7AEZ0G4FdzuCiE6zbQ_ykYZ4DJGdAVcJEN
Us640gsT_PH7MMyPw11bsDY3VvZZWqoDU2C3r8rmSJPVea3w5k2LwUGzoSGbkRGn0dE5JpP369fLJiYk
k5PRiDTPlrW11Mkpwd09dckSeXBwkVRasX59fVpaU35.a0lJe3W1vqGhr7nZeP68qbMTwQeEgUL7SPuZ
8TPdUt0W5C7wLfalqigJK4k6HrVWuzb5anL63XT5E3nBeIEKd0Fs7LSkJIeMjC_z8tx37PDZsyegrk58
.HDUyZPxWm1KR0fW7dsKg6F4aKji5Us1ogggDCAKYA0Af7kUgHSAbAAFQCGACqACoAbgJ4BDADw5IhBJ
raQJMxJS3VLl3vKigKKK0Ip6WX1TUlNrZmu7ol1fou_b12dkjaZjJjyL_BP0erx1C7u78d49vH8fOQ4H
BtBoxOFhfPECx8bw1St8.xYnJ_nvRZpjGY5lOZZwLMexyLEUsjSyDLIssgRZDllElqIITRGGIixFCEU4
iiBFKJrQNGFowtKE0ISjCdKEYgjNEIYhLEMIQziGIEMoltAsYVjCsoRMHcUX5svwSXwI75gCRwjytTlC
c4ThCMtNuTiO4OTYwYONSqUS.V5HwPcK3.94fP15XNmUI2d1ZDT.rwEp_5TFTY2DpHCxCFQfOkt4Q5gl
ieO7CyTvZcW1tG_5AEmoaHnM0q79VXrNjkW2O2tmq8ovBG.bbRvkblXsYNdwZUBT_e.defNfybqcR46v
KK0_sDPo.p9q9e5r_tK_m8e8hOmQ6KY47O2yM0O_2P5Ym2CvecGdlG880uqVEgu82.pLT7_s2ZaRPVO1
MOs3.HlB2OoNdo9_qPtA_OyT4yOCzXv9AiKVMaesUi3cu0ZLHaOHv7h6qtwlCozZyvCwQJi33.zZ3OSq
VQKBzmWTJJw7tMHll_Z6szsXQqo3tq33eXTa2yMof6v75Rl_9dguerhRvCUZdt8qnPW86OOj1XM95oip
B3PnPf3qDzFl7tfYexEDQ7rFRR0C0xLrUkVQsbLbYvjA7try9n6_zb3ErMwz3Tcm.J3lc3HirFVLtxcG
L3s850ZAVm3zUql65N34WXrl9I_yZG.F8ukLxx3ObN2mvdI7cO6kVw99Zu2a77YbmKNOpW0J2.3n8.R6
KWLW5ARvzcjYlJkDkNeffSMiW9elk0k0MWNdqzz1V706Y8ckXh7XFnaaQ8mwcOKIYls8nwehIZGiE0GJ
Rf8BTwVuLA::

画像は飛廉さんより拝借。

対応フォーマットは gif 、png 、jpg のみ。対応サイズは 10KB までだけど、マイクロソフトの情報によると「[IE] URL に使用可能な文字数は最大 2,083 文字」だそうなので、大抵の場合はこっちの制限の方が厳しい。実際問題、32 x 32 くらいの大きさでないと使えない (笑)

これを作った理由 (というか背景) は 3 つある。

  • 1 つめはチャット。チャットをしているとき、ローカルにある画像を相手に見てもらいたい。けど、ホームページスペースは持ってないこともあるし、画像掲示板はサーバ側で画像を保存されるのが気に食わない。そういうとき、これで URIエンコードすれば、テキストベースで渡せるし相手も気楽に参照できる。はずだった。でも URI 長すぎだし、サイズ制限も厳しすぎ (笑)
  • 2 つめは、なんとなくテーブルアートに対抗してみたかった。
  • 3 つめは、QUERY_STRING が好きだから。ちょっといじめてみたくなった。これは達成かな。

エンコード・デコードのアルゴリズムは以下のとおり。他に特筆するところがないのでソースコードは出さなくてもいいよね。

# エンコード (data : 画像データ)
[Zlib::Deflate.deflate(data, Zlib::BEST_COMPRESSION)].pack("m").gsub("\n", "").tr("/+=", "_.:")

# デコード (data : エンコードされたデータ)
Zlib::Inflate.inflate(data.tr("_.:", "/+=").scan(/.{60}|.*\z/).join("\n").unpack("m")[0])