2016-04-06 13 views
1

skaliert Ich habe folgendes kairo Code:Kairo Bild unscharf, wenn

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); 

Und

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 ist ein 5x5 Bild: enter image description here

Aber wenn das Programm ausgeführt wird , das Bild ist leicht verschwommen:
enter image description here

Ich habe bereits versucht

cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); 

aber es funktioniert nicht.

Gibt es eine Möglichkeit, dieses Problem zu beheben?

+0

Dies liegt daran, wie das Bild hochskaliert wird. Anstatt eine Quelloberfläche direkt zu setzen, erstellen Sie mit 'cairo_pattern_create_for_surface()' ein Muster aus der Oberfläche, rufen Sie 'cairo_pattern_set_filter()' auf, um den Skalierungsmodus einzustellen, und rufen Sie 'cairo_set_source()' auf, um das Muster zu laden. Siehe die Dokumentation zu 'cairo_filter_t' für die Skalierungsmodi. 'CAIRO_FILTER_NEAREST' beispielsweise gibt Ihnen einen normalen Pixelzoom ohne Verwischungen oder andere Transformationen. – andlabs

+0

Die Verwendung von 'CAIRO_FILTER_NEAREST' hat funktioniert. Vielen Dank. –

Antwort

2

Dies liegt daran, wie das Bild hochskaliert wird. Anstatt eine Quelloberfläche direkt festzulegen, erstellen Sie ein Muster aus der Oberfläche mit cairo_pattern_create_for_surface(), rufen Sie cairo_pattern_set_filter() darauf an, um den Skalierungsmodus festzulegen, und rufen Sie dann cairo_set_source() auf, um das Muster zu laden. Informationen zu den Skalierungsmodi finden Sie in der Dokumentation für cairo_filter_t. CAIRO_FILTER_NEAREST zum Beispiel gibt Ihnen einen normalen Pixel-Zoom ohne Weichzeichnung oder andere Transformationen.