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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top