开罗:模糊的形状和文字

时间:2014-05-18 19:18:11

标签: c++ performance graphics cairo blurry

我在其图像表面通过cairo绘制一些随机矩形,缩放和翻译并使用

显示结果
unsigned char* data = cairo_image_surface_get_data(surface);

但矩形看起来很模糊: (我无法发布截图)

角落(可能)未映射到整数坐标。包含data的纹理与surface的大小和格式相同,我已经使用了AntiAliasing设置(文本显示更加模糊!!)。如何将生成的形状映射到整数坐标并提高质量(不使用超级采样且不丢弃缩放转换)?

编辑:我使用下面的代码(有和没有第三行),它没有用!:

cairo_save(cr);    
cairo_identity_matrix(cr);
cairo_translate(cr, 0.5, 0.5);
cairo_scale(cr, size.width, size.height);
cairo_set_antialias(cr, CAIRO_ANTIALIAS_GOOD);
(make the drawing!!)
cairo_restore(cr);

Edit2:我使用了捕捉乐趣。 (在所有转换代码之后),但它也不起作用:

double szero1 = zero,szero2 = zero, sone1 = one, sone2 = one;
snapToPixel(cr, &szero1, &szero2);
snapToPixel(cr, &sone1, &sone2);
cairo_rectangle (cr, szero1, szero2, sone1, sone2);

3 个答案:

答案 0 :(得分:0)

没有预处理坐标,就无法强制cairo捕捉到最近的整数像素坐标。

void snapToPixel(cairo_t *cr, float *x, float *y) {
     cairo_user_to_device (cr, x, y);
     *x = round(*x);
     *y = round(*y);
     cairo_device_to_user (cr, x, y);
}

笔画宽度会出现同样的问题(如果x, y,则width != height会有+不同。)

http://cairographics.org/FAQ/#sharp_lines

的更多信息

答案 1 :(得分:0)

我使用了整数,但是仍然模糊

func (me *canvas) DrawRectF(left, top, right, bottom float32, paint *Paint) {
    if right <= left || bottom <= top {
        return
    }

    C.cairo_set_antialias(me.ptr, C.CAIRO_ANTIALIAS_NONE)

    fix := paint.Style == STROKE && int32(paint.Width)%2 != 0
    fix = false
    if fix {
        me.Save()
        me.TranslateF(0.5, 0.5)

    }
    C.cairo_rectangle(me.ptr, 100, 100, 500, 500)
    C.cairo_rectangle(me.ptr, 110, 110, 510, 510)
    me.drawPaint(paint)

    if fix {
        me.Restore()
    }
}

这是开罗的一行
enter image description here

这是代码编辑器中的一行
enter image description here

我应该如何像代码编辑器那样用单像素宽的线条画出清晰的线条?

答案 2 :(得分:0)

我知道这不是cairo的问题,但SDL2,SDL2需要设置SDL_WINDOW_ALLOW_HIGHDPI以显示单个像素线,但是我发现了另一个问题,这次我使用cairo_surface_write_to_png而不使用SDL2,这条线清晰明了,但文字模糊。自爆图片是开罗和其他应用之间的文字比较。 enter image description here

cairo_surface_t *surface;     
    cairo_t *cr;                  
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 100, 100);
    cr = cairo_create (surface);

    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
    cairo_paint(cr);


    cairo_text_extents_t extents;
    const char *utf8 = "bulrry text";
    double x,y;
    printf("x = %f, y = %f ", x, y);
    snapToPixel(cr, &x, &y);
    printf("x = %f, y = %f ", x, y);

    // cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST);
    cairo_select_font_face (cr, "mono",
        CAIRO_FONT_SLANT_NORMAL,
        CAIRO_FONT_WEIGHT_NORMAL);

    cairo_set_font_size (cr, 14.0);
    cairo_text_extents (cr, utf8, &extents);
    x = 128.0-(extents.width/2 );
    y = 128.0-(extents.height/2 );

    cairo_move_to (cr, 0, 15);
    cairo_set_source_rgba (cr, 1, 1, 1, 1);
    cairo_show_text (cr, utf8);

    /* draw helping lines */
    cairo_set_source_rgb (cr, 1, 0, 0);
    cairo_set_line_width (cr, 1.0);
    cairo_rectangle(cr, 20.5, 20.5, 50, 50);
    cairo_stroke (cr);
    cairo_surface_write_to_png(surface , "./a.png");