Schienen:Bild zuschneiden mit Büroklammer, S3 und RMagick
-
05-07-2019 - |
Frage
Ich bin derzeit versuchen zu code a custom image cropping system ähnlich zu anderen auf dem internet, wo ein Benutzer können wählen Sie eine gewünschte Fläche und haben dann Ihr Bild passend zugeschnitten.Die Anwendung ist in Rails und wir sind mit Büroklammer mit Amazon S3 zum speichern von Dateien.Ich habe eine Menge ärger, obwohl immer RMagick angemessen zu Ernte die Datei von S3.Hier ist der aktuelle code (der nicht funktioniert):
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
Das Hauptproblem ist, dass das zugeschnittene Bild wird nicht hochgeladen zurück zu S3 durch Büroklammer, und somit nicht richtig abgeschnitten.Hat jemand versucht, so etwas wie dies mit Büroklammer vor?Dies kann nicht einmal möglich, aber jede Hilfe würde sehr geschätzt werden.
Lösung
Ich habe in der Lage, dieses problem zu lösen, für die Zeit wie folgt:
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
Das Hauptanliegen hier ist die Geschwindigkeit, schlagen die Schaffung einer neuen temporären Datei, so werden wir wohl müssen unseren eigenen benutzerdefinierten Schnittstelle.Hoffentlich kann dies ein guter Ausgangspunkt für Menschen, die die Lösung eines ähnlichen Problems.
EDIT:Nur eine kurze Notiz, Tempfile, ist Teil der Büroklammer Bibliotheken.
Andere Tipps
Könnten Sie einige attr_accessors auf dem Modell und legen Sie diese in die controller-Aktion vor dem erstellen der eigentlichen Datei.Die unten sollte funktionieren ..
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
Möchten Sie vielleicht einen genaueren Blick auf Büroklammer-Prozessoren.
Ich habe eigentlich das gleiche problem in meinem eigenen code ein, der auf meiner todo-Liste.