40 lines
1.1 KiB
Ruby
40 lines
1.1 KiB
Ruby
class Pixmap
|
|
PIXMAP_FORMATS = ["P3", "P6"] # implemented output formats
|
|
PIXMAP_BINARY_FORMATS = ["P6"] # implemented output formats which are binary
|
|
|
|
def write_ppm(ios, format="P6")
|
|
if not PIXMAP_FORMATS.include?(format)
|
|
raise NotImplementedError, "pixmap format #{format} has not been implemented"
|
|
end
|
|
ios.puts format, "#{@width} #{@height}", "255"
|
|
ios.binmode if PIXMAP_BINARY_FORMATS.include?(format)
|
|
@height.times do |y|
|
|
@width.times do |x|
|
|
case format
|
|
when "P3" then ios.print @data[x][y].values.join(" "),"\n"
|
|
when "P6" then ios.print @data[x][y].values.pack('C3')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def save(filename, opts={:format=>"P6"})
|
|
File.open(filename, 'w') do |f|
|
|
write_ppm(f, opts[:format])
|
|
end
|
|
end
|
|
|
|
def print(opts={:format=>"P6"})
|
|
write_ppm($stdout, opts[:format])
|
|
end
|
|
|
|
def save_as_jpeg(filename, quality=75)
|
|
pipe = IO.popen("convert ppm:- -quality #{quality} jpg:#{filename}", 'w')
|
|
write_ppm(pipe)
|
|
pipe.close
|
|
end
|
|
end
|
|
|
|
image = Pixmap.open('file.ppm')
|
|
image.save_as_jpeg('file.jpg')
|