2011-04-29 4 views
3

나는 공백과 가운데로 '덧씌우 기'하고 싶은 이미지가 있습니다.중첩으로 이미지 크기를 변경하는 RMagick

대부분의 경우 이미지 크기를 16 또는 32 픽셀에서 최대 32 픽셀로 조정해야합니다. 이미지가 16 픽셀 인 경우 각면에 8 픽셀의 공백을 추가하여 32 픽셀 이미지로 만듭니다 (중간에 원래의 플로팅).

32 픽셀 이미지의 경우 아무 것도 변경되지 않습니다. 나는 변환을 수행하기 위해 RMagick을 사용하고

는 : OK 작업,하지만 작은 이미지가 새로운 이미지의 왼쪽 상단에 있습니다

image.change_geometry!("#{size}x#{size}") { |cols, rows, img| 
    newimg = img.extent(cols, rows) 
    newimg.write("#{RAILS_ROOT}#{path}/#{name}.png") 
} 

, 중앙에 위치하지 않을 수 있습니다. 나는 중력 설정을보고 있었는데, 내가 필요한 것처럼 보이지만, 그것을 호출에서 지정하는 방법을 찾을 수 없습니까?

미리 감사드립니다.

답변

1

extent() 메서드는 두 개의 매개 변수 x & y 오프셋을 사용하며이 오프셋은 이미지를 범위 내에 배치합니다. 예를 들어, 100x100 이미지의 범위를 묻는 경우 원본은 50x50 뿐이므로 img.extent (100, 100, 25, 25) - 오프셋 25에서 시작하도록 이미지를 설정합니다. 25 (따라서 센터링).

참고 : 음의 오프셋 값을 사용하는 기대 정도와 약간의 문제가있다 (이 경우는 -25을하고 싶은 것, -25) -이를 확인 :

why is the behavior of extent (imagemagick) not uniform across my machines?

2

확인 구현을 다음 carrierwave 함수 http://rubydoc.info/gems/carrierwave/0.5.1/CarrierWave/RMagick#resize_and_pad-instance_method

이것은 상기 방법의 버전은 RMagick 의존성을 이용하는 것이다

require 'RMagick' 
include Magick 

module Converter 
    def self.resize_and_pad(img, new_img_path, width, height, background=:transparent, gravity=::Magick::CenterGravity) 
    img.resize_to_fit!(width, height) 
    new_img = ::Magick::Image.new(width, height) 
    if background == :transparent 
     filled = new_img.matte_floodfill(1, 1) 
    else 
     filled = new_img.color_floodfill(1, 1, ::Magick::Pixel.from_color(background)) 
    end 
    # destroy_image(new_img) 
    filled.composite!(img, gravity, ::Magick::OverCompositeOp) 
    # destroy_image(img) 
    # filled = yield(filled) if block_given? 
    # filled 
    filled.write new_img_path 
    end 
end 
관련 문제