링크 한 이미지는 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 }
커지면 커질 수있는 이미지를 제공 할 수 있습니까? 가장 좋은 추측은 낮은 색상 수로 시작하지만 크기가 변경되면 일부 픽셀에 병합 된 색상이 생성되어 새로운 이미지에서 디더링 (RLE 효율 감소)되거나 원본에서 더 큰 팔레트가 필요할 것입니다. –
예제 파일은 다음과 같습니다 소스 파일 - https://dl.dropboxusercontent.com/u/47897449/s_image.gif (602 x 429) 대상 파일 - https://dl.dropboxusercontent.com/u/47897449/ t_image.gif (301 x 214) 죄송하지만 저는이 분야의 전문가가 아닙니다. 그러나 당신이 무엇인가를 지적 할 수 있거나, 내가 무엇을 할 수 있는지 자세히 설명 할 수 있다면. –
Ruby와 아무런 관련이 없습니다. –