Commit 119a44b5 by Prem Sichanugrist

Add animated image support in thumbnail generation

There's a case when you really don't want to make a thumbnail of only the first frame, such as making thumbnail for GIF image. This patch will check that the source and output format is an animated format, and not calling `[0]` on it.

Closes #454
parent c2d19bff
...@@ -4,6 +4,9 @@ module Paperclip ...@@ -4,6 +4,9 @@ module Paperclip
attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options, :source_file_options attr_accessor :current_geometry, :target_geometry, :format, :whiny, :convert_options, :source_file_options
# List of formats that we need to preserve animation
ANIMATED_FORMATS = %w(gif)
# Creates a Thumbnail object set to work on the +file+ given. It # Creates a Thumbnail object set to work on the +file+ given. It
# will attempt to transform the image into one defined by +target_geometry+ # will attempt to transform the image into one defined by +target_geometry+
# which is a "WxH"-style string. +format+ will be inferred from the +file+ # which is a "WxH"-style string. +format+ will be inferred from the +file+
...@@ -58,7 +61,7 @@ module Paperclip ...@@ -58,7 +61,7 @@ module Paperclip
parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ") parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ")
success = Paperclip.run("convert", parameters, :source => "#{File.expand_path(src.path)}[0]", :dest => File.expand_path(dst.path)) success = Paperclip.run("convert", parameters, :source => "#{File.expand_path(src.path)}#{'[0]' unless animated?}", :dest => File.expand_path(dst.path))
rescue Cocaine::ExitStatusError => e rescue Cocaine::ExitStatusError => e
raise PaperclipError, "There was an error processing the thumbnail for #{@basename}" if @whiny raise PaperclipError, "There was an error processing the thumbnail for #{@basename}" if @whiny
rescue Cocaine::CommandNotFoundError => e rescue Cocaine::CommandNotFoundError => e
...@@ -77,5 +80,12 @@ module Paperclip ...@@ -77,5 +80,12 @@ module Paperclip
trans << "-crop" << %["#{crop}"] << "+repage" if crop trans << "-crop" << %["#{crop}"] << "+repage" if crop
trans trans
end end
protected
# Return true if the format is animated
def animated?
ANIMATED_FORMATS.include?(@current_format[1..-1]) && (ANIMATED_FORMATS.include?(@format.to_s) || @format.blank?)
end
end end
end end
...@@ -254,4 +254,53 @@ class ThumbnailTest < Test::Unit::TestCase ...@@ -254,4 +254,53 @@ class ThumbnailTest < Test::Unit::TestCase
end end
end end
end end
context "An animated gif" do
setup do
@file = File.new(File.join(File.dirname(__FILE__), "fixtures", "animated.gif"), 'rb')
end
teardown { @file.close }
should "start with 12 frames with size 100x100" do
cmd = %Q[identify -format "%wx%h" "#{@file.path}"]
assert_equal "100x100"*12, `#{cmd}`.chomp
end
context "with static output" do
setup do
@thumb = Paperclip::Thumbnail.new(@file, :geometry => "50x50", :format => :jpg)
end
should "create the single frame thumbnail when sent #make" do
dst = @thumb.make
cmd = %Q[identify -format "%wx%h" "#{dst.path}"]
assert_equal "50x50", `#{cmd}`.chomp
end
end
context "with animated output format" do
setup do
@thumb = Paperclip::Thumbnail.new(@file, :geometry => "50x50", :format => :gif)
end
should "create the 12 frames thumbnail when sent #make" do
dst = @thumb.make
cmd = %Q[identify -format "%wx%h" "#{dst.path}"]
assert_equal "50x50"*12, `#{cmd}`.chomp
end
end
context "with omitted output format" do
setup do
@thumb = Paperclip::Thumbnail.new(@file, :geometry => "50x50")
end
should "create the 12 frames thumbnail when sent #make" do
dst = @thumb.make
cmd = %Q[identify -format "%wx%h" "#{dst.path}"]
assert_equal "50x50"*12, `#{cmd}`.chomp
end
end
end
end end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment