Gyazo, 通常は全ての画像を png で保存するんだけど、png は写真やゲームのスクリーンショットなど、色数の多い画像を扱うのにあまり向いていない。なのでそういった画像の場合には jpeg へ変換する様 upload.cgi を修正した。
画像編集には RMagick を利用しています。
#!/home/ryomatsu/.rbenv/shims/ruby
# -*- ruby -*-
#
# $Date$
# $Rev$
#
require 'cgi'
require 'digest/md5'
require 'sdbm'
require 'RMagick'
cgi = CGI.new("html3")
id = cgi.params['id'][0].read
imagedata = cgi.params['imagedata'][0].read
hash = Digest::MD5.hexdigest(imagedata)
create_newid = false
if not id or id == "" then
id = Digest::MD5.hexdigest(cgi.remote_addr + Time.now.to_s)
create_newid = true
end
dbm = SDBM.open('db/id',0644)
dbm[hash] = id
dbm.close
filename = "img/#{hash}.png"
File.open(filename,"w").print(imagedata)
if imagedata.bytesize > 100000
image = Magick::Image.from_blob(imagedata).first
filename = "img/#{hash}.jpeg"
image.write(filename)
end
headers = {}
if create_newid then
headers = {"X-Gyazo-Id"=>id}
end
cgi.out(headers){"http://gyazo.loumo.jp/#{filename}"}
色数の多い、と書いたがあれこれ考えるのが面倒くさいので単純に png のファイルサイズが 100k 超えたら Jpeg に変換したものも保存、クライアントへも Jpeg の URL を返します。
一行目が自分の環境のままだがまあいいか。。。