Ressimensionamento no estilo Flickr com o apetment_fu
-
20-09-2019 - |
Pergunta
Quero que o Apptment_fu redimensione minhas miniaturas de maneira semelhante à do Flickr, Facebook e Twitter lidam com isso: se eu quiser uma miniatura de 100x100, quero que a miniatura seja exatamente 100x100 com qualquer excesso cortado para que a proporção seja preservada.
Alguma ideia?
Solução 4
Minha solução foi mergulhar na pasta Plug -in APCTIMENT_FU (fornecedor/plugins) e editar o arquivo rmagick_processor.rb. Primeiro, renomeei REDIMED_IMAGE para redimensionar_image_internal, depois adicionei:
def resize_image(img, size)
# resize_image take size in a number of formats, we just want
# Strings in the form of "square: WxH"
if (size.is_a?(String) && size =~ /^square: (\d*)x(\d*)/i) ||
(size.is_a?(Array) && size.first.is_a?(String) &&
size.first =~ /^square: (\d*)x(\d*)/i)
iw, ih = img.columns, img.rows
aspect = iw.to_f / ih.to_f
if aspect > 1
shave_off = (iw - ih) / 2
img.shave!(shave_off, 0)
else
shave_off = (ih-iw) / 2
img.shave!(0, shave_off)
end
resize_image_internal(img, "#{$1}x#{$2}!")
else
resize_image_internal(img, size) # Otherwise let attachment_fu handle it
end
end
Agora posso usar 'Square: 100x100' como minha string de geometria. Observe que o código acima assume que a saída necessária é quadrada.
Outras dicas
Para configurar as miniaturas de 100x100, adicione o seguinte ao seu modelo:
has_attachment :content_type => :image,
:storage => IMAGE_STORAGE,
:max_size => 20.megabytes,
:thumbnails => {
:thumb => '100x100>',
:large => '800x600>',
}
(Neste exemplo, estou criando uma miniatura de 100x100 e também um tamanho de 800x600 'grande', adicional para manter o tamanho original.)
Além disso, lembre -se de que a miniatura pode não ser exatamente 100x100; Ele terá uma dimensão máxima de 100x100. Isso significa que, se o original tiver uma ração de 4: 3, a miniatura seria 100x75. Não tenho certeza se é isso que você quis dizer com "exatamente 100x100 com qualquer excesso de corte para que a proporção seja preservada".
Adicione isso ao seu modelo
protected
# Override image resizing method
def resize_image(img, size)
# resize_image take size in a number of formats, we just want
# Strings in the form of "crop: WxH"
if (size.is_a?(String) && size =~ /^crop: (\d*)x(\d*)/i) ||
(size.is_a?(Array) && size.first.is_a?(String) &&
size.first =~ /^crop: (\d*)x(\d*)/i)
img.crop_resized!($1.to_i, $2.to_i)
# We need to save the resized image in the same way the
# orignal does.
self.temp_path = write_to_temp_file(img.to_blob)
else
super # Otherwise let attachment_fu handle it
end
end
e mude o tamanho da miniatura para:
:thumbnails => {:thumb => 'crop: 100x100' }
fonte:
http://stuff-things.net/2008/02/21/quick-and-dirty-cropping-images-with-attachment_fu/
Há uma diretiva de cultivo que pode ser dada na especificação:
has_attachment :content_type => :image,
:thumbnails => {
:thumb => '100x100#'
}
Memonic: '#' se parece com a ferramenta de cultivo.
Editar: Correção
has_attachment :content_type => :image,
:thumbnails => {
:thumb => '100x100!'
}
O método anterior era para clipe de papel que possui uma notação diferente.