Rieles: recorte de imagen con Paperclip, S3 y RMagick
-
05-07-2019 - |
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.
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.