2014-02-20 2 views
4

GIF 이미지의 크기를 다른 크기로 조정하려고합니다. Ruby에서 RMagick 라이브러리를 사용하고 있습니다. 하지만 일부 GIF 이미지의 경우 GIF 크기를 축소 할 때도 파일 크기가 커집니다. 그리고 동일한 가로 세로 비율로 이미지 이미지의 크기를 조정하고 있습니다. 여기에 내 코드가있다.루비로 애니메이션 GIF 이미지 크기를 조정 하시겠습니까?

require 'rmagick' 
path = "/path/to/file/" 
s_image = "image.gif" # image is 320*320 
t_image = "t.gif" 
file_name = path+s_image 
file = File.new(file_name) 
list = Magick::ImageList.new.from_blob file.read 
list = list.coalesce.remap 
list.each do |x| 
    x.resize_to_fill!(256,256) 
end 
File.open("#{path+t_image}", 'wb') { |f| f.write list.to_blob } 

무엇이 누락 되었습니까?

+0

커지면 커질 수있는 이미지를 제공 할 수 있습니까? 가장 좋은 추측은 낮은 색상 수로 시작하지만 크기가 변경되면 일부 픽셀에 병합 된 색상이 생성되어 새로운 이미지에서 디더링 (RLE 효율 감소)되거나 원본에서 더 큰 팔레트가 필요할 것입니다. –

+0

예제 파일은 다음과 같습니다 소스 파일 - https://dl.dropboxusercontent.com/u/47897449/s_image.gif (602 x 429) 대상 파일 - https://dl.dropboxusercontent.com/u/47897449/ t_image.gif (301 x 214) 죄송하지만 저는이 분야의 전문가가 아닙니다. 그러나 당신이 무엇인가를 지적 할 수 있거나, 내가 무엇을 할 수 있는지 자세히 설명 할 수 있다면. –

+1

Ruby와 아무런 관련이 없습니다. –

답변

7

링크 한 이미지는 35 프레임으로 구성됩니다. 또한 최적화되어 첫 번째 프레임 이후에 각 프레임에는 다른 픽셀 만 포함됩니다. 아주 작은 움직임 때문에 대부분의 픽셀이 투명합니다. 이것은 애니메이션 GIF의 일반적인 상황입니다. 변경이나 카메라 움직임이 너무 많지 않은 경우 파일 크기면에서 상대적으로 효율적으로 만들 수 있습니다.

또한 각 프레임 크기는 모든 변경 픽셀을 포함하는 데 필요한 최소 사각형이므로 프레임마다 다릅니다.

예를 들어 원본 이미지를로드하면이 사실을 분명히 알 수 있습니다. 김프는 개별 레이어를 검사합니다.

변환 된 이미지로 변환 할 경우 정확한 크기를 재조정하기 위해 코드가 전체 프레임을 렌더링하는지 확인할 수도 있습니다. 이것의 부작용으로 파일 크기가 커집니다. 이미지 x, y를 반으로 줄이면 출력 파일 크기가 원본의 1/4 정도가됩니다. 그러나 각 프레임을 단지 몇 픽셀 차이에서 전체 프레임으로 바꾸면 크기가 크게 늘어납니다. 35 프레임이 있기 때문에 이보다 작은 폭과 높이를 보완 할 수 있습니다.

다행히 ImageMagick (및 Ruby의 Rmagick 바인딩)은 GIF를 가시 픽셀로 저장된 차이만으로 다시 레이어에 최적화하는 기능을 포함하고 있습니다. 코드를 더 낮은 파일 크기로 만들려면이 optimize_layers 메서드에 대한 호출을 추가해야합니다. 또한 최적의 파일 크기를 얻으려면 .remap의 사용을 중지해야합니다. 이는 픽셀 값을 변경하여 옵티 마이저가 작동하지 않을 정도로 충분합니다.

require 'rmagick' 
path = "/path/to/file/" 
s_image = "s_image.gif" # image is 320*320 
t_image = "t_image.gif" 
file_name = path+s_image 
file = File.new(file_name) 
list = Magick::ImageList.new.from_blob file.read 

# This renders out each GIF frame in full, prior to re-sizing 
# Note I have removed the .remap because it alters pixel values 
# between frames, making it hard to optimise 
list = list.coalesce 

list.each do |x| 
    x.resize_to_fill!(256,256) 
end 

# Re-optimize the GIF frames 
list = list.optimize_layers(Magick::OptimizeLayer) 

File.open("#{path+t_image}", 'wb') { |f| f.write list.to_blob } 
+1

CompareClearLayer를 사용하면 애니메이션이 작동하지 않지만 OptimizeLayer를 사용하면 효과적입니다. –

+0

@ Narenda Rajput : 테스트하는 동안 혼란 스러웠을 것입니다. 답변을 조정했습니다. 감사합니다. 그것은 작동하고 파일 크기는 작지만 결과는 내 설정에 약간 실망입니다.논리적으로 훨씬 작은 파일 크기를 얻을 수 있어야하지만, 그 이외의 것을 변경해야하는지 확신 할 수 없다. –

+0

@Narenda Rajput :'.remap'을 제거하면 색이 미묘하게 변경되어 프레임을 최적화 할 수 없게된다. . –

관련 문제