Trilhos: Imagem corte com Paperclip, S3 e RMagick
-
05-07-2019 - |
Pergunta
Atualmente estou tentando código de uma imagem personalizada sistema semelhante ao outros na internet, onde um usuário pode selecionar uma área de recorte e, em seguida, corte têm sua imagem recortada em conformidade. O aplicativo está em Rails e estamos usando Paperclip com o Amazon S3 para armazenar os arquivos. Estou tendo um monte de problemas, embora ficando RMagick para cortar adequadamente o arquivo de S3. Aqui está o código atual (que não funciona):
if params[:width].to_i > 0 and params[:height].to_i > 0 then
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
photo.update_attributes({:photo => orig_img.to_blob})
photo.photo.reprocess!
photo.save
end
O principal problema é que a imagem recortada não é enviado de volta para S3 através de clipe de papel, e, portanto, não devidamente cortadas. Alguém já tentou algo parecido com isto com clipe antes? Isso não pode mesmo possível, mas qualquer ajuda seria muito apreciada.
Solução
Eu tenho sido capaz de resolver este problema para o momento da seguinte forma:
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
tmp_img = Tempfile.new("image_data")
orig_img.format = "png"
tmp_img.write(orig_img.to_blob)
photo.photo = tmp_img
tmp_img.close
photo.photo.reprocess!
photo.save
A principal preocupação aqui é a velocidade bateu de criar um novo arquivo temporário, então provavelmente vamos ter que criar a nossa própria interface personalizada. Esperemos que este pode ser um bom ponto de partida para pessoas resolvendo um problema semelhante.
EDIT:. Apenas uma nota rápida, Tempfile faz parte das bibliotecas paperclip
Outras dicas
Você pode definir alguns attr_accessors sobre o modelo e colocá-las na ação do controlador antes de criar o arquivo real. A seguir deve funcionar ..
class Poodle < ActiveRecord::Base
has_attached_file :avatar, :styles => Proc.new{|a| a.instance.get_styles}
attr_accessor :width, :height
def get_styles(style = "medium")
return {style.to_sym => [self.width, self.height].join("x") + ">" }
end
end
Você pode querer dar uma olhada em Paperclip processadores .
Na verdade, tenho o mesmo problema no meu próprio código, e ter isso na minha lista de tarefas.