52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
module DanbooruImageResizer
|
|
def resize(read_path, write_path, width, height, resize_quality = 90)
|
|
image = Magick::Image.read(read_path).first
|
|
geometry = "#{width}x>"
|
|
|
|
if width == Danbooru.config.small_image_width
|
|
# wider than it is tall
|
|
geometry = "#{Danbooru.config.small_image_width}x#{Danbooru.config.small_image_width}>"
|
|
end
|
|
|
|
image.change_geometry(geometry) do |new_width, new_height, img|
|
|
img.resize!(new_width, new_height)
|
|
width = new_width
|
|
height = new_height
|
|
end
|
|
|
|
image = flatten(image, width, height)
|
|
image.strip!
|
|
|
|
image.write(write_path) do
|
|
self.quality = resize_quality
|
|
# setting PlaneInterlace enables progressive encoding for JPEGs
|
|
self.interlace = Magick::PlaneInterlace
|
|
end
|
|
|
|
image.destroy!
|
|
FileUtils.chmod(0664, write_path)
|
|
end
|
|
|
|
def flatten(image, width, height)
|
|
if image.alpha?
|
|
# since jpeg can't represent transparency, we need to create an image list,
|
|
# put a white image on the bottom, then flatten it.
|
|
|
|
list = Magick::ImageList.new
|
|
list.new_image(width, height) do
|
|
self.background_color = "#FFFFFF"
|
|
end
|
|
list << image
|
|
flattened_image = list.flatten_images
|
|
list.each do |image|
|
|
image.destroy!
|
|
end
|
|
return flattened_image
|
|
else
|
|
return image
|
|
end
|
|
end
|
|
|
|
module_function :resize, :flatten
|
|
end
|