Pregunta

Actualmente estoy tratando de codificar un sistema de recorte de imágenes personalizado similar a otros en Internet, donde un usuario puede seleccionar un área de recorte y luego recortar su imagen en consecuencia. La aplicación está en Rails y estamos usando Paperclip con Amazon S3 para almacenar los archivos. Estoy teniendo muchos problemas, pero hacer que RMagick recorte adecuadamente el archivo de S3. Aquí está el código actual (que no 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

El problema principal es que la imagen recortada no se vuelve a cargar en S3 a través de un clip, y por lo tanto no se recorta correctamente. ¿Alguien ha intentado algo como esto con un clip antes? Esto puede que ni siquiera sea posible, pero cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

He podido resolver este problema por el momento, como sigue:

  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

La principal preocupación aquí es la velocidad de creación de un nuevo archivo temporal, por lo que probablemente tendremos que crear nuestra propia interfaz personalizada. Esperamos que este sea un buen punto de partida para que las personas resuelvan un problema similar.

EDIT: Solo una nota rápida, Tempfile es parte de las bibliotecas de clip.

Otros consejos

Puede definir algunos attr_accessors en el modelo y configurarlos en la acción del controlador antes de crear el archivo real. Lo de abajo debería 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

Es posible que desee echar un vistazo más de cerca a procesadores Paperclip .

En realidad tengo el mismo problema en mi propio código y lo tengo en mi lista de tareas pendientes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top