画像ファイルの幅と高さを取得

Rubyで画像ファイルの幅と高さを取得するやつをつくった。

対応している形式はjpeg, png, gifの三種類。jpegはもしかすると解析できない場合があるかも。

# public domain
def get_imgsize(path, type = :auto)
	if type == :auto
		type = File.extname(path)[1..-1].downcase.to_sym
		type = :jpeg if type == :jpg
	end
	
	File.open(path, "rb") do |f|
		case type
		when :jpeg
			while true
				break unless f.read(1) == "\xff"
				case f.read(1)
				when "\xc0", "\xc2"
					f.seek(3, IO::SEEK_CUR)
					return f.read(4).unpack("n2").reverse
				when "\xd8", "\xd9"
				when "\x00"
					break
				else
					f.seek(f.read(2).unpack("n")[0] - 2, IO::SEEK_CUR)
				end
			end
			raise RuntimeError, "analysis failed"
		when :png
			if f.read(8) == "\x89PNG\r\n\x1a\n"
				f.seek(8, IO::SEEK_CUR)
				return f.read(8).unpack("N2")
			else
				raise RuntimeError, "analysis failed"
			end
		when :gif
			if f.read(3) == "GIF"
				f.seek(3, IO::SEEK_CUR)
				return f.read(4).unpack("v2")
			else
				raise RuntimeError, "analysis failed"
			end
		else
			raise ArgumentError, "#{type} is unsupported"
		end
	end
end

width, height = get_imgsize("sample.jpg")