2012-03-26 6 views
5

Im mit Trägerwelle, um Gifs hochzuladen, die gut funktioniert, kommt das Problem, wenn ich versuche, die DIFF-Version zu generieren und das GIF in ein JPEG mit nur das erste Bild in der GIF als konvertieren Daumen, ich erhalte eine Fehlermeldung:Das erste Bild in GIF mit Carrierwave

LocalJumpError in ImagesController#create 

no block given (yield) 

app/controllers/images_controller.rb:21:in `new' 
app/controllers/images_controller.rb:21:in `create' 

Anfrage

Parameter:

{"utf8"=>"✓", 
"authenticity_token"=>"lPEjP1WtPxFdizL2/FAWGHzOZPtecb5nKzKO8dg5ZdE=", 
"image"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x007ff5d4cdc720 @original_filename="some-file-name.gif", 
@content_type="image/gif", 
@headers="Content-Disposition: form-data; name=\"image[image]\"; filename=\"some-file-name.gif\"\r\nContent-Type: image/gif\r\n", 
@tempfile=#<File:/var/folders/c8/1t7w8nln4b3bvs4_nv2cyn2m0000gt/T/RackMultipart20120326-5101-gcyvk0>>, 
"remote_image_url"=>"", 
"title"=>"The red panda", 
"nsw"=>"0"}, 
"commit"=>"Roll GIF"} 

Hier ist der Code im mit dem Daumen zu generieren:

version :thumb do 
    process :resize_to_limit => [200, 200] 
    process :convert => 'jpg' 
end 

Hope you guys können helfen und danke im voraus.

+0

Wenn jemand damit zu kämpfen hat, können Sie die folgende Antwort sehen: –

Antwort

6

Um Animationen von einem GIF-Bild mit carrierwave zu entfernen, können Sie den folgenden Prozessor definieren:

def remove_animation 
    manipulate! do |img, index| 
    index == 0 ? img : nil 
    end 
end 

So wird der Code für den Daumen Version sein:

version :thumb do 
    process :remove_animation 
    process :resize_to_limit => [200, 200] 
    process :convert => 'jpg' 
end 
+1

funktioniert perfekt mit mir übergeben – equivalent8

0

Das ist also der Code, den ich verwenden, um zu erreichen, was ich wollte:

manipulate! do |image| 
    gif = Magick::ImageList.new image.filename 
    jpg = gif[0] 
    jpg.resize_to_fill!(200,200) 
    jpg.write("thumb_#{secure_token}.#{format}") 
    jpg 
end 
+0

Das hat bei mir nicht funktioniert. Ich schaute auf das Dokument, scheint wie manipulieren wird das Bild laden und dann jeden der Frames an den mitgelieferten Block –

1

Hier ist, wie ich ein animiertes Gif Abflachung endete (Extraktion aus dem ersten Bild des gif).

process :custom_convert => 'jpg' 

    # Method handles gif animation conversion by extracting out first frame within a gif 
    def custom_convert(format) 
    cache_stored_file! if !cached? 
    image = ::Magick::Image.read(current_path) 
    frames = image.first 
    frames.write("#{format}:#{current_path}") 
    destroy_image(frames) 
    end 
1

hinzufügen Folgendes zu Ihrer Uploader-Klasse:

version :thumb do 
    process :remove_animation 
    process :resize_to_limit => [200, 200] 
    process :convert => 'jpg' 
end 

# add process :remove_animation to other thumbs 

private 
def remove_animation 
    if content_type == 'image/gif' 
    manipulate! { |image| image.collapse! } 
    end 
end