2011-12-07 7 views
16

मुझे यह काम करने के लिए एक समय का एक बिल्ली था, और अभी भी हूं। मैं इसके दिल में जाऊंगा। मैं जेक्रॉप और कैरियरवेव का उपयोग करके फसल काम करने के लिए रयान बेट्स ट्यूटोरियल का अनुसरण कर रहा हूं। मैंने मिनीमैजिक का उपयोग करने का विकल्प चुना है क्योंकि मेरी मशीन पर ImageMagick और RMagick को पुनर्स्थापित करने के बाद भी मुझे एक त्रुटि मिलती है जो मेरी स्थानीय मशीन पर रेल सर्वर को मार देती है। वैसे भी MiniMagick पर स्विचिंग मेरे लिए तय है। तो इस बिंदु तक सब कुछ वास्तव में अच्छा है। मेरे पास विभिन्न आकार की छवियां बनाई जा रही हैं, और उन्हें सफलतापूर्वक अपलोड किया जा रहा है। लेकिन एक बार मैं काट-छांट करने की कोशिश मैं इस त्रुटि मिलती है:अपरिभाषित विधि फसल! रेलवे पर मिनीमैजिक के साथ कैरियरवेव का उपयोग 3.1.3

undefined method `crop!' for #<MiniMagick::CommandBuilder:0x000001052e4608> 

यह मैं हूँ से बाहर बिल्ली को भ्रमित कर रहा है, क्योंकि मैं बहुत ज्यादा बेट्स के रूप में ठीक उसी कोड का उपयोग कर रहा:

def crop 
if model.crop_x.present? 
    resize_to_limit(700, 700) 
    manipulate! do |img| 
    x = model.crop_x.to_i 
    y = model.crop_y.to_i 
    w = model.crop_w.to_i 
    h = model.crop_h.to_i 
    img.crop!(x, y, w, h) 
    end 
end 
end 

वैसे भी, यह वह फसल विधि है जो असफल हो रही है। तो मैंने खुद को सोचा, यह एक छवि मैगिक कमांड है ... इसलिए मैंने ImageMagick doco को देखा, और मुझे बैंग के साथ फसल विधि नहीं मिली, इसलिए मैंने इसे बिना कोशिश की, और फिर त्रुटि यह हो जाती है:

No such file or directory - /var/folders/dF/dFNM2+Y7FVScn4+OxVHKOU+++TI/-Tmp-/mini_magick20111207-34409-1tnaa07.jpg 

वैसे भी, कुछ मुझे समझ में नहीं आता है, किसी भी मदद की सराहना की जाएगी! पढ़ने के लिए धन्यवाद!

+0

एक अद्यतन:

# Concatenating plus signs with plus signs is atrociously confusing. # Recommended only if you want to drive your future self insane. mogrify_arg = w + 'x' + h + '+' + x + '+' + y # Readable but inefficient mogrify_arg = [ w, 'x', h, '+', x, '+', y ].join('') # Questionable readability mogrify_arg = "#{w}x#{h}+#{x}+#{y}" # Slick, performant, but potentially risky: '<<' modifies the receiving object in place # 'w' is actually changing here to "WxH+X+Y"... mogrify_arg = w << 'x' << h << '+' << x << '+' << y # A lovely, self-documenting version size = w << 'x' << h offset = '+' << x '+' << y mogrify_arg = "#{size}#{offset}" 

यहां एक संपूर्ण उदाहरण है! मैं बहुत निराश हो गया, और एक नई मशीन पर फिर से सब कुछ करने की कोशिश की। मैं वापस Rmagick गया और यह इस बार काम किया। मुख्य बात मेरे सेटअप के साथ लगती थी। मुझे यकीन नहीं है कि विशेष रूप से क्या है, लेकिन इसमें Ghostscript और/या MacPorts के साथ कुछ करना था। मैकपोर्ट को हटाने, इमेजमैजिक को पुनर्स्थापित करने, rmagick को पुनर्स्थापित करने, भूतपूर्व को पुनर्स्थापित करने के अंत में यह मेरे लिए किया! धन्यवाद! – counterbeing

+0

यह वास्तव में अजीब है: | –

उत्तर

14

भी उन्हीं समस्याओं का था, मेरे समाधान के लिए इस विधि

def cropped_image(params) 
    image = MiniMagick::Image.open(self.image.path) 
    crop_params = "#{params[:w]}x#{params[:h]}+#{params[:x]}+#{params[:y]}" 
    image.crop(crop_params) 

    image 
end 

बस अपने मामले के लिए मेरी विधि को संशोधित किया गया था।
कुंजी वह है जिसमें प्रारूप फसल विधि में चर पास करता है, उम्मीद है कि इससे आपकी मदद मिलती है।

img.crop("#{size}#{offset}") # Doesn't return an image... 
img # ...so you'll need to call it yourself 

यहाँ एक बेहतर है:

+0

यह वास्तव में होनहार लग रहा है, मैं सिर्फ अपनी फसल विधि को अपडेट करने के लिए इस छवि = MiniMagick :: Image.open (model.pdf_url) शामिल करने के लिए कोशिश की है लेकिन यह मुझ पर एक त्रुटि थूकना है। कुंजी पर किसी भी सुझाव का उपयोग करना चाहिए? त्रुटि मैं इस तरह के कोई फ़ाइल या निर्देशिका है - अच्छी तरह से /uploads/tmp/20111207-1235-34409-8280/backsideart_stevie.jpg – counterbeing

+0

, मैं इसे minimagick [https://github.com/probablycorey/mini_magick/ wiht एक मुद्दा है लगता है मुद्दों/54]। मेरे पास पहले है, लेकिन जब मैं ऊपर की तरह फसल विधि को फिर से लिखता हूं तो यह गायब हो जाता है। यह अजीब बात है कि आप अभी भी इसका सामना कर रहे हैं। –

+3

बस जोड़ने के लिए ... मैंने मिखाइल के कोड से क्या किया है। महत्वपूर्ण बात स्पष्ट है (जैसा कि उसने सही मायने में बताया है) (1) 'फसल' के साथ 'फसल' को प्रतिस्थापित करें और 'मैनिपुलेट!' ब्लॉक के अंत में छवि को वापस कर दें अन्यथा आपको लिखने की त्रुटियां मिलेंगी। 'ruby def फसल यदि model.crop_x.present? resize_to_limit (600, 600) हेरफेर! करो | img | एक्स = model.crop_x.to_i y = model.crop_y.to_i w = model.crop_w.to_i एच = model.crop_h.to_i img.crop ("# {w} एक्स # {ज} + # {x } + # {y} ") img अंत अंत अंत' '' –

2

मैं के रूप में @ मिखाइल-nikalyukin

def crop 
    manipulate! do |img| 
    img.crop "750x600+0+0" 
    img.strip 

    img = yield(img) if block_given? 
    img 
    end 
end 
47

संक्षेप में द्वारा संकेत प्राप्त करने के लिए इस फसल आदेश के एक्स और वाई पैरामीटर जोड़कर काम करने में सक्षम था का स्पष्टीकरण क्यों यह एक कट/पेस्ट शैली समाधान के विपरीत हुआ।

आरएमएजिक और मिनीमैजिक एक दूसरे के बदले नहीं हैं। RMagick एक बहुत ही रूबी की तरह डीएसएल है और इस तरह के रूप तरीकों कि कई तर्क ले कार्यरत हैं:

rmagick_image.crop(x_offset, y_offset, width, height) # Returns an image object 
rmagick_image.crop!(x_offset, y_offset, width, height) # Edits object in place 

MiniMagick बजाय गतिशील iterating through a list of MOGRIFY_COMMANDS द्वारा तरीकों कि कई पानी का छींटा-उपसर्ग के विकल्प ImageMagick's mogrify documentation में निर्दिष्ट के साथ मेल उत्पन्न करता है। उन तरीकों में से प्रत्येक mogrify को सीधे उनके तर्कों गुजरती हैं और कोई भी एक छवि वस्तु लौट:

minimagick_image.crop('100x200') # Translates to `mogrify -crop 100x200 image.ext` 
minimagick_image.polaroid('12') # Executes `mogrify -polaroid 12 image.ext` 

तरह में, RMagick crop! है और MiniMagick नहीं करता है।

ImageMagick दस्तावेज़ों के अनुसार, mogrify -crop एक तर्क geometry लेता है। geometry तर्क here समझाया गया है। आप देखेंगे कि उन सभी तर्कों के स्ट्रिंग हैं, इसलिए crop(100,200) के बजाय आप crop('100x200') या crop('100%) का उपयोग करेंगे। यह बहुत रूबी जैसा नहीं है, लेकिन यह मिनीमैजिक को इतना हल्का बनाता है।

कि ज्ञान के साथ

, हम MiniMagick साथ फसल के लिए कैसे यह मान सकते हैं। mogrify -crop एक स्ट्रिंग widthएक्सheight+xoffset+yoffset के रूप में एक ज्यामिति ले जा सकते हैं, तो हम सिर्फ एक समान स्ट्रिंग का निर्माण करने की जरूरत है।

को देखते हुए w, h, x, और y आप इस्तेमाल कर सकते हैं तो निम्न में से जो भी आप सबसे अधिक पठनीय लगता है:

def crop 
    if model.crop_x.present? 
    resize_to_limit(700, 700) 

    manipulate! do |img| 
     x = model.crop_x 
     y = model.crop_y 
     w = model.crop_w 
     h = model.crop_h 

     size = w << 'x' << h 
     offset = '+' << x << '+' << y 

     img.crop("#{size}#{offset}") # Doesn't return an image... 
     img # ...so you'll need to call it yourself 
    end 

    end 
    end 
+1

धन्यवाद! इस बारे में अच्छी व्याख्या के लिए पूरी सुबह देख रहे थे। – MBHNYC

+0

वास्तव में स्पष्टीकरण स्पष्ट करें। सिर्फ एक जवाब नहीं। –

+0

@ फ़ारज़ कुछ ऐसा होने का अद्भुत स्पष्टीकरण जो मैं होने की उम्मीद कर रहा था क्योंकि मैं मिनीमैजिक उदाहरण के लिए एक आरएमएजिक उदाहरण देख रहा था। केवल जारी करने वाला मैं आकार और ऑफसेट के साथ था जो उत्पन्न होता है, स्ट्रिंग को रेल से इंटीजर त्रुटियों में परिवर्तित नहीं कर सकता। – Jerome

संबंधित मुद्दे