2011-11-03 16 views
5

me gustaría Carrierwave para producir un par de versiones de una imagen, una en formato PNG, y uno en formato jpeg, pero me parece que no puede conseguir que funcione. Me doy cuenta de que se han formulado varias preguntas similares aquí y en otros lugares, pero no he podido encontrar una solución. Más o menos, esto es lo que tengo:Problemas con Carrierwave: convertir

class MyUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    version :jpeg do 
    process :convert => 'jpg' 
    # more procesors 
    process :processed => :jpg 
    end 

    version :png do 
    process :convert => 'png' 
    # more processors 
    process :processed => :png 
    end 

    def store_path(for_file = filename) 
    if version_name != :png 
     return "#{version_name}.jpg" 
    else 
     return "#{version_name}.png" 
    end 
    end 

    def filename 
    filename = if version_name != :png 
     super != nil ? super.split('.').first + '.jpg' : super 
    else 
     super != nil ? super.split('.').first + '.png' : super 
    end 
    end 

end 

lo tanto, independientemente del tipo de formato de imagen que pase adentro, esto produce dos archivos: uno llamado jpg.jpg, y uno llamado png.png. jpg.jpg es de hecho siempre un archivo JPEG (como se comprueba con el comando de Unix file), pero png.png es sólo un verdadero archivo con formato PNG si y sólo si paso originalmente en un archivo PNG-formateado (pasando de un archivo JPEG resultados en un archivo de formato JPEG) !

Ideas?

esto podría no ser útil, pero encontrar el método convert en Carrierwave sí sospechoso: convert(some_format) llamadas manipulate!(:format => some_format), que a su vez llama a (some_image_object).write("#{some_format}:#{current_path}"). Ahora bien, si la imagen original es aprobada en bla.format (format = jpg, png, etc), current_path con una extensión de .formato (probado a través de un mono-parche en manipulate!). Y la forma en que funciona la conversión de formato de imagen en RMagick es llamando al write con un argumento que tiene la extensión deseada. Entonces, ¿por qué tendría lugar la conversión jpeg anterior? Y si es así, ¿por qué fallaría la conversión png?

También, si es útil, estoy on Rails 3.0.9 y 0.5.6 Carrierwave

Gracias!

Respuesta

5

así que no estoy seguro de por qué este es el caso, pero resulta que el problema está en la parte # more processors de la versión PNG que escondí anteriormente. Omitirlos de la versión conduce a un archivo PNG genuino para cualquier tipo de entrada. Estos procesadores llaman al manipulate! y hacen algunas cosas. En su lugar, la solución era llamar al manipulate!(:format => 'png'). Hurra.

+0

gracias, salvaste mi noche –

+1

Cualquier persona que mire esta respuesta puede leer esto: http://stackoverflow.com/questions/19625066/carrierwave-rmagick-not-removing-transparency-in-convert-to-jpg – JakeTheSnake

Cuestiones relacionadas