2012-01-05 16 views
6

así que creé una imagen PNG usando chunky_png. No quiero guardar esta imagen, porque solo es útil para esta solicitud, por lo que intento guardar esta imagen como una variable de instancia y mostrarla en mi vista.mostrando una imagen creada con chunkypng directamente (sin guardar)

el problema es que esto da como resultado un error invalid byte sequence in UTF-8 en mi vista.

lo que hice:

# controller 
@img = source_img.resize(200, 200).to_string 

#view 
<img src="data:image/png;base64,<%= @img %>" /> 

depuración de la variable @img con raise @img.to_yaml salidas mí la cadena correcta, f.e .:

--- !binary |- 
    iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAACP0lEQVR4nO1Y 
    QY6jQAy0AxJ9a34AH8l29lmRhgDJSDxrwsxHmh80N5Ag3urkjFZabTw5TJ+g 
    HclWUa6ys5Ots6Ot8xP5/xFhnJIGxo/GdDD9HC+al6iNMpGFVie3kXOiyZET 
    8bq49cAipRn5bVXOB+CVPiXPXyMRhQb1PDvPRmQZAMWOam/cN1TgpKFEyIVT 
    pENLDF6oVoCuSCkdSIokEJnICy41K+AojX4psutY5+8011m80O1T4YpXxsOJ 
    3mjqo2A8Jc+/RD7txVNhWFrJPDnTF41uBfPvoXKJHw/jjt7QLMThqKuj2Ufe 
    +bUEFDeigtykr1UsVQkT2TP0cjA0H6wuR4VPkKilmMCDACjISmhLXc/64Ap+ 
    mp3RJZ3IFTVpe9aXXHxawKzOY/Ss8WCVHX2u7hjYNa/yxNsWSrEULzJT0Cd1 
    XgToXEDWx/WgWRtPHKkZGSJ86ccDHjqvy9E1ryHfKORkmwJ+5u7NoqoUoXXQ 
    axqTYS6Ng2jWukoBD6/7qI+2sc2AmUIKLnUxkHzFMDURVXdHx3hT97pd8hU6 
    v9B8Ghs0qOnhIO9PybMZQRuumKTM42Ii3o2zew2lYLnBvRKP9ryErjeEd10/ 
    fexmaznti8ZWbopoJV5XKeIGJp6TUEEyDGVXZbV8bGCMqRPbTyQnlpDjNzAk 
    gZXbNhxLINKH5+XZjsxsJD8DAwjGPtf+CnEDI8xVIX4HQ4aDtlLEDSzx5hdk 
    M77FuUp5/9mKPHazu5LX97+wMH42qhX8RP4AQpEyh+7r4x0AAAAASUVORK5C 
    YII= 

copiing esta cadena manualmente en la etiqueta img muestra la imagen correctamente.

¿Alguna idea de qué va mal aquí? otras ideas de mostrar esta imagen directamente sin guardar?

gracias de antemano! si algo no está claro, POR FAVOR deje un comentario.

+0

¿Ha intentado añadir to_yaml a su src attr? – Yule

+0

@Yule '.to_yaml' no bloquea mi aplicación, pero, por supuesto, la imagen no se mostrará, debido al formato yaml. – choise

+0

trozo de un truco, pero ¿qué pasa con .to_yaml.to_s? – Yule

Respuesta

8

ChunkyPNG viene con una función integrada para hacer esto: to_data_url.

# controller 
@img = source_img.resize(200, 200) 

# view 
<img src="<%= @img.to_data_url %>" /> 

se implementa como esto:

['data:image/png;base64,', @img.to_blob].pack('A*m').gsub(/\n/, '') 

asegurarse de que está utilizando la última versión de ChunkyPNG.

+0

¿Los raíles proporcionan un método auxiliar para mostrar imágenes con cadenas de datos? – choise

3

La forma de @wvanbergen me dio algunos errores, pero cambié un poco y funcionó.

#controller 
    @png = qr.to_img.resize(250,250).to_data_url 

    #view 
    <%= image_tag @png %> 
Cuestiones relacionadas