정의되지 않은 방법 자르기!레일에서 MiniMagick과 함께 Carrierwave 사용 3.1.3

StackOverflow https://stackoverflow.com/questions/8418973

문제

나는 이것을 작동시키는 데 엄청난 시간을 보내고 있었고 여전히 그렇습니다.나는 그것의 핵심에 접근할 것이다.저는 Jcrop과 Carrierwave를 사용하여 자르기 작업을 수행하기 위해 Ryan Bates 튜토리얼을 따르고 있습니다.내 컴퓨터에 ImageMagick과 RMagick을 다시 설치한 후에도 로컬 컴퓨터의 레일 서버를 종료시키는 오류가 발생하기 때문에 MiniMagick을 사용하기로 선택했습니다.어쨌든 MiniMagick으로 전환하면 문제가 해결되었습니다.그래서 지금까지 모든 것이 정말 좋았습니다.다양한 크기의 이미지가 생성되고 있으며 성공적으로 업로드되고 있습니다.하지만 자르려고 하면 다음 오류가 발생합니다.

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

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

어쨌든 실패한 것은 자르기 방법입니다.그래서 나는 그것이 ImageMagick 명령이라고 생각했습니다.그래서 ImageMagick doco를 보았는데 뱅이 있는 크롭 방법을 찾을 수 없어서 뱅을 사용하지 않고 시도해 보았는데 다음과 같은 오류가 발생합니다.

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

어쨌든 뭔가 이해가 안 되는 부분이 있어서 도움을 주시면 감사하겠습니다!읽어 주셔서 감사합니다!

도움이 되었습니까?

해결책

는 동일한 문제가있었습니다. 내 해결책은이 방법이었습니다

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

여기에 대한 더 나은 설명이 있습니다. 이는 잘라내기/붙여넣기 스타일 솔루션과 반대로 발생했습니다.

RMagick과 MiniMagick은 서로 바꿔 사용할 수 없습니다.RMagick은 매우 Ruby와 유사한 DSL을 가지고 있으므로 여러 인수를 취하는 메서드를 사용합니다.

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은 다음과 같이 동적으로 메소드를 생성합니다. 목록을 반복 MOGRIFY_COMMANDS 에 지정된 수많은 대시 접두사 옵션과 일치합니다. ImageMagick의 mogrify 선적 서류 비치.각 메소드는 인수를 직접 전달합니다. 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 주장이 설명된다 여기.당신은 그것을 알아 차릴 것입니다 모두 해당 인수 중 문자열이 있으므로 대신 crop(100,200) 당신은 사용할 것이다 crop('100x200') 또는 crop('100%).Ruby와 매우 유사하지는 않지만 이것이 MiniMagick을 매우 가볍게 만드는 이유 중 하나입니다.

그 지식을 바탕으로 MiniMagick으로 자르는 방법을 추론할 수 있습니다. mogrify -crop 기하학을 문자열로 받아들일 수 있다 width엑스height+xoffset+yoffset, 이므로 비슷한 문자열을 작성하면 됩니다.

주어진 w,h,x, 그리고 y 다음 중 가장 읽기 쉬운 것을 사용할 수 있습니다.

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

완전한 예는 다음과 같습니다.

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

@ mikhail-nikalykin 에 의해 표시된대로 자르기 명령에 x 및 y 매개 변수를 추가하여 작업을 수행 할 수있었습니다.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top