2012-03-26 10 views
5

Im utilizzando l'onda portante per caricare gif che funziona correttamente, il problema si presenta quando provo a generare la versione per il pollice e convertire la gif in un file jpeg con la prima immagine della gif come pollice, ottengo un errore:Ottenere la prima immagine in gif utilizzando l'onda del gestore

LocalJumpError in ImagesController#create 

no block given (yield) 

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

Richiesta

Parametri:

{"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"} 

Ecco il codice im utilizzando per generare il pollice:

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

Spero che voi ragazzi potete aiutare e grazie in anticipo.

+0

Se qualcuno ha lottato con questo prima di poter vedere la risposta seguente: –

risposta

6

Per rimuovere le animazioni da un'immagine GIF usando carrierwave, è possibile definire i seguenti processori:

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

Quindi, il codice per la versione pollice sarà:

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

funziona perfettamente con me – equivalent8

0

Quindi questo è il codice che ho usato per realizzare quello che volevo:

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

Questo non ha funzionato per me. Ho guardato il documento, sembra che manipolare caricherà l'immagine e poi passerà ciascuno dei frame al blocco fornito –

1

Ecco come ho finito per appiattire una gif animata (estraendo la prima immagine della 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

Add quanto segue alla tua classe di uploader:

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 
Problemi correlati