سؤال

وأنا أحاول حاليا لرمز نظام الاقتصاص صورة مخصصة مشابهة لبعضها الآخر على شبكة الانترنت حيث يمكن للمستخدم تحديد مساحة زراعة المحاصيل ومن ثم يكون صورتهم اقتصاص وفقا لذلك. التطبيق في القضبان ونستخدمه مشبك مع الأمازون 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

وقد تحتاج إلى إلقاء نظرة فاحصة على معالجات مشبك .

وأنا فعلا نفس المشكلة في التعليمات البرمجية بلدي، ويكون هذا على قائمتي ما يجب عمله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top