2011-12-07 26 views
16

Tôi đã có một thời gian để việc này hoạt động và vẫn đang hoạt động. Tôi sẽ nhận được trái tim của nó. Tôi đang theo hướng dẫn của Ryan Bates để làm cho việc cắt xén bằng cách sử dụng Jcrop và Carrierwave. Tôi đã chọn sử dụng MiniMagick vì ngay cả sau khi cài đặt lại ImageMagick và RMagick trên máy tính của mình, tôi nhận được một lỗi sẽ giết chết máy chủ đường ray trên máy cục bộ của tôi. Dù sao chuyển sang MiniMagick đã khắc phục điều đó cho tôi. Vì vậy, mọi thứ thực sự tốt đẹp cho đến thời điểm này. Tôi có hình ảnh có kích thước khác nhau đang được sản xuất và chúng đang được tải lên thành công. Nhưng một khi tôi cố gắng để cắt tôi nhận được lỗi này:Undefined Phương pháp cắt! Sử dụng Carrierwave với MiniMagick trên đường ray 3.1.3

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

này là khó hiểu các heck ra khỏi tôi, vì tôi đang sử dụng khá nhiều cùng mã chính xác như Bates:

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 

Dù sao, đó là phương pháp cắt không thành công. Vì vậy, tôi nghĩ đến bản thân mình, đó là một lệnh ImageMagick ... Vì vậy, tôi nhìn vào tài liệu ImageMagick, và tôi không thể tìm thấy phương pháp cây trồng với các bang, vì vậy tôi đã thử nó mà không có, và sau đó lỗi quay về điều này:

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

Dù sao, điều gì đó không có ý nghĩa với tôi, mọi trợ giúp sẽ được đánh giá cao! Cảm ơn bạn đã đọc!

+0

Bản cập nhật! Tôi đã rất thất vọng, và thử lại mọi thứ trên một cỗ máy mới. Tôi quay trở lại Rmagick và nó đã làm việc lần này. Điều quan trọng dường như là với thiết lập của tôi. Tôi không chắc chắn cụ thể những gì, nhưng nó đã có một cái gì đó để làm với Ghostscript và/hoặc MacPorts. Loại bỏ macports, cài đặt lại imagemagick, cài đặt lại rmagick, cài đặt lại ghostcript cuối cùng đã làm nó cho tôi! Cảm ơn! – counterbeing

+0

Điều đó thực sự kỳ lạ: | –

Trả lời

14

Đã những vấn đề tương tự, giải pháp của tôi là phương pháp này

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 

Chỉ việc điều chỉnh phương pháp của tôi đối với trường hợp của bạn.
Điều quan trọng là định dạng chuyển biến cho phương thức cắt, hy vọng điều này sẽ giúp bạn.

+0

Điều đó có vẻ thực sự hứa hẹn, tôi vừa cố gắng cập nhật phương pháp cắt của mình để bao gồm hình ảnh này = MiniMagick :: Image.open (model.pdf_url) Nhưng nó đang phát ra lỗi ở tôi. Bất kỳ đề nghị về chìa khóa tôi nên sử dụng? Lỗi tôi nhận được là Không có tệp hoặc thư mục như vậy - /uploads/tmp/20111207-1235-34409-8280/backsideart_stevie.jpg – counterbeing

+0

, tôi cho rằng đó là một vấn đề với minimagick [https://github.com/probablycorey/mini_magick/ vấn đề/54]. Tôi có nó trước đây, nhưng nó biến mất khi im viết lại phương pháp cây trồng như trên. Thật kỳ lạ khi bạn vẫn gặp phải nó. –

+3

Chỉ cần thêm ... Đây là những gì tôi đã làm từ mã của Mikhail. Điều quan trọng rõ ràng (như anh ta đã chỉ ra đúng) là (1) thay thế 'crop! 'Bằng' crop' và cũng trả về ảnh ở cuối 'manipulate!' Nếu không bạn sẽ nhận được lỗi write.'' 'ruby def crop nếu model.crop_x.present? resize_to_limit (600, 600) thao tác! 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 ("# {w} x # {h} + # {x } + # {y} ") img kết thúc kết thúc kết thúc' '' –

2

tôi đã có thể có được điều này để làm việc bằng cách thêm các thông số X và Y để lệnh cắt như đã nêu bởi @ Mikhail-nikalyukin

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

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

Nói tóm lại:

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

Dưới đây là một tốt hơn giải thích về lý do tại sao điều này xảy ra thay vì giải pháp kiểu cắt/dán.

RMagick và MiniMagick không thể hoán đổi cho nhau. RMagick có Ruby-như rất DSL và như vậy sử dụng phương pháp mà phải mất nhiều đối số:

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 thay vì tự động tạo ra các phương pháp bởi iterating through a list of MOGRIFY_COMMANDS phù hợp với nhiều tùy chọn dash-tiền tố quy định tại ImageMagick's mogrify documentation. Mỗi của những phương pháp vượt qua lập luận của họ trực tiếp đến mogrify và không trả về một đối tượng hình ảnh:

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

Trong loại, RMagick có crop! và MiniMagick không.

Theo tài liệu ImageMagick, mogrify -crop lấy đối số geometry. Đối số geometry được giải thích here. Bạn sẽ nhận thấy rằng tất cả của các đối số đó là chuỗi, do đó thay vì crop(100,200) bạn sẽ sử dụng crop('100x200') hoặc crop('100%). Nó không giống Ruby, nhưng đó là một phần của những gì làm cho MiniMagick trở nên rất nhẹ.

Với kiến ​​thức đó, chúng tôi có thể suy ra cách cắt bằng MiniMagick. mogrify -crop có thể mất một hình học như là một chuỗi widthxheight+xoffset+yoffset, vì vậy chúng ta chỉ cần xây dựng một chuỗi tương tự.

Với w, h, x, và y bạn có thể sử dụng bất cứ điều nào sau đây bạn tìm thấy dễ đọc nhất:

# 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}" 

Dưới đây là một ví dụ hoàn chỉnh:

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

Cảm ơn! Đã được tìm kiếm tất cả các buổi sáng cho một lời giải thích tốt về điều này. – MBHNYC

+0

Giải thích thực sự rõ ràng. không chỉ là một câu trả lời. –

+0

@faraz giải thích tuyệt vời về điều tôi mong đợi xảy ra khi tôi đang xem một ví dụ về rMagick đang được xem xét cho ví dụ về MiniMagick. Chỉ phát hành tôi đã có được với kích thước và bù đắp mà tạo ra không thể chuyển đổi String thành Integer lỗi từ Rails. – Jerome

Các vấn đề liên quan