القضبان: صورة الاقتصاص مع مشبك الورق، S3 وRMagick
-
05-07-2019 - |
سؤال
وأنا أحاول حاليا لرمز نظام الاقتصاص صورة مخصصة مشابهة لبعضها الآخر على شبكة الانترنت حيث يمكن للمستخدم تحديد مساحة زراعة المحاصيل ومن ثم يكون صورتهم اقتصاص وفقا لذلك. التطبيق في القضبان ونستخدمه مشبك مع الأمازون S3 لتخزين الملفات. أواجه الكثير من المتاعب على الرغم من الحصول على RMagick على المحاصيل بشكل مناسب الملف من S3. هنا هو رمز الحالي (الذي لا يعمل):
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
والمشكلة الرئيسية هي أن الصورة التي تم قصها ليست تحميلها إلى S3 من خلال مشبك، وبالتالي لا اقتصاص بشكل صحيح. وقد أي شخص حاول شيئا من هذا القبيل مع مشبك من قبل؟ هذا قد لا حتى ممكن، ولكن أي مساعدة سيكون موضع تقدير كبير.
المحلول
ولقد كنت قادرا على حل هذه المشكلة في الوقت الحاضر كما يلي:
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
والقلق الرئيسي هنا هو سرعة ضرب من إنشاء ملف مؤقت جديد، لذلك ربما سيكون لدينا لخلق لدينا واجهة مخصصة الخاصة. نأمل أن هذا يمكن أن يكون نقطة انطلاق جيدة للناس حل مشكلة مشابهة.
وتحرير: مجرد ملاحظة سريعة، Tempfile هو جزء من المكتبات مشبك
نصائح أخرى
هل يمكن تحديد بعض attr_accessors على نموذج وتضعها في العمل تحكم قبل إنشاء الملف الفعلي. أدناه يجب أن تعمل ..
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
وقد تحتاج إلى إلقاء نظرة فاحصة على معالجات مشبك .
وأنا فعلا نفس المشكلة في التعليمات البرمجية بلدي، ويكون هذا على قائمتي ما يجب عمله.