2016-04-06 2 views
1

je le code cairo suivant:l'image du Caire floue lorsque l'échelle

cairo_set_source_rgba(cr, 1, 1, 1, 1); 
cairo_rectangle(cr, 0, 0, WINDOW_SIZE, WINDOW_SIZE); 
cairo_fill(cr); 
cairo_scale(cr, 8, 8); 
draw_image(cr, "q.png", 5, 5); 

Et

void draw_image(cairo_t* cr, char* img_name, int x, int y) 
{ 
    cairo_translate(cr, x, y); 
    cairo_surface_t* img = cairo_image_surface_create_from_png(img_name); 
    cairo_set_source_surface(cr, img, 0, 0); 
    cairo_paint(cr); 
    cairo_translate(cr, -x, -y); 
} 

q.png est une image 5x5: enter image description here

Mais quand le programme est exécuté , l'image est légèrement floue:
enter image description here

J'ai déjà essayé

cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); 

mais il ne fonctionne pas.

Y at-il un moyen de résoudre ce problème?

+0

Ceci est dû à la façon dont l'image est mise à l'échelle. Au lieu de définir directement une surface source, créez un motif sur la surface avec 'cairo_pattern_create_for_surface()', appelez cairo_pattern_set_filter() 'pour définir le mode de mise à l'échelle, puis appelez cairo_set_source()' pour charger le motif. Voir la documentation de 'cairo_filter_t' pour les modes de mise à l'échelle. 'CAIRO_FILTER_NEAREST', par exemple, vous donnera un zoom normal de pixel sans flou ou autres transformations. – andlabs

+0

L'utilisation de 'CAIRO_FILTER_NEAREST' a fonctionné. Je vous remercie. –

Répondre

2

Ceci est dû à la façon dont l'image est mise à l'échelle. Au lieu de définir directement une surface source, créez un motif hors de la surface avec cairo_pattern_create_for_surface(), appelez le cairo_pattern_set_filter() pour définir le mode de mise à l'échelle, puis appelez cairo_set_source() pour charger le motif. Voir la documentation pour cairo_filter_t pour les modes de mise à l'échelle. CAIRO_FILTER_NEAREST, par exemple, vous donnera un zoom pixel normal sans flou ou d'autres transformations.