2016-04-06 15 views
1

をスケーリングしたときに、私は、次のカイロコードを持っている:カイロの画像

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

そして

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は、5×5の画像です: enter image description here

しかし、ときに、プログラムが実行されます、画像はわずかにぼやけて表示されます:
enter image description here

私はすでに

cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); 

を試してみましたが、それは動作しません。

この問題を解決する方法はありますか?

+0

これは、画像の拡大率のためです。ソースサーフェスを直接設定するのではなく、 'cairo_pattern_create_for_surface()'でサーフェスからパターンを作成し、スケーリングモードを設定するために 'cairo_pattern_set_filter()'を呼び出し、 'cairo_set_source()'を呼び出してパターンをロードします。スケーリングモードについては 'cairo_filter_t'のドキュメントを参照してください。例えば、 'CAIRO_FILTER_NEAREST'は、ぼかしやその他の変形を伴わない通常のピクセルズームを行います。 – andlabs

+0

'CAIRO_FILTER_NEAREST'を使用しました。ありがとうございました。 –

答えて

2

これは、画像がどのように拡大されたかによるものです。ソースサーフェスを直接設定する代わりに、cairo_pattern_create_for_surface()を使用してサーフェスからパターンを作成し、cairo_pattern_set_filter()を呼び出してスケーリングモードを設定し、cairo_set_source()を呼び出してパターンをロードします。スケーリングモードについては、cairo_filter_tのドキュメントを参照してください。たとえば、CAIRO_FILTER_NEARESTは、ぼかしやその他の変形がない通常のピクセルズームを提供します。