0

我正在通过cairo在其图像表面中绘制一些随机矩形,缩放和翻译它并使用显示结果

unsigned char* data = cairo_image_surface_get_data(surface);

但矩形似乎模糊:( 我无法发布屏幕截图)

角(可能)未映射到整数坐标。包含的纹理data大小和格式与surface我已经使用抗锯齿设置相同(文本显示更加模糊!!)。我应该怎么做才能将结果形状映射到整数坐标并提高质量(不使用超级采样并且不放弃缩放转换)?

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

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

3 回答 3

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, yif中的不同width != height)。

更多信息,请访问http://cairographics.org/FAQ/#sharp_lines

于 2014-05-18T19:27:58.013 回答
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()
    }
}

这是开罗的一条线
在此处输入图像描述

这是代码编辑器中的一行
在此处输入图像描述

我应该怎么做才能像代码编辑器一样用单像素宽的线画一个锐利的线?

于 2020-05-03T03:59:17.517 回答
0

我知道这不是cairo的问题而是SDL2,SDL2需要设置SDL_WINDOW_ALLOW_HIGHDPI显示单像素线,但是我发现anth问题,这次我用cairo_surface_write_to_png没有SDL2,线条清晰明亮,但文字模糊。吹出的图片是 cairo 和其他应用程序之间的文本比较。 在此处输入图像描述

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");
于 2020-05-05T01:31:37.120 回答