forked from asonix/mastodon
To improve the way super tall or super ride images are treated, the numbers remain the same, 1280x1280 and 400x400, but if an image is less in one dimension than the other, the other can become larger Thanks to @WAHa_06x36@mastodon.social for the tip
35 lines
1.3 KiB
Ruby
35 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Paperclip
|
|
class LazyThumbnail < Paperclip::Thumbnail
|
|
def make
|
|
return File.open(@file.path) unless needs_convert?
|
|
|
|
if options[:geometry]
|
|
min_side = [@current_geometry.width, @current_geometry.height].min.to_i
|
|
options[:geometry] = "#{min_side}x#{min_side}#" if @target_geometry.square? && min_side < @target_geometry.width
|
|
elsif options[:pixels]
|
|
width = Math.sqrt(options[:pixels] * (@current_geometry.width.to_f / @current_geometry.height.to_f)).round.to_i
|
|
height = Math.sqrt(options[:pixels] * (@current_geometry.height.to_f / @current_geometry.width.to_f)).round.to_i
|
|
options[:geometry] = "#{width}x#{height}>"
|
|
end
|
|
|
|
Paperclip::Thumbnail.make(file, options, attachment)
|
|
end
|
|
|
|
private
|
|
|
|
def needs_convert?
|
|
needs_different_geometry? || needs_different_format?
|
|
end
|
|
|
|
def needs_different_geometry?
|
|
(options[:geometry] && @current_geometry.width != @target_geometry.width && @current_geometry.height != @target_geometry.height) ||
|
|
(options[:pixels] && @current_geometry.width * @current_geometry.height > options[:pixels])
|
|
end
|
|
|
|
def needs_different_format?
|
|
@format.present? && @current_format != @format
|
|
end
|
|
end
|
|
end
|