我在其图像表面通过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);
答案 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
会有+不同。)
答案 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()
}
}
我应该如何像代码编辑器那样用单像素宽的线条画出清晰的线条?
答案 2 :(得分:0)
我知道这不是cairo的问题,但SDL2,SDL2需要设置SDL_WINDOW_ALLOW_HIGHDPI
以显示单个像素线,但是我发现了另一个问题,这次我使用cairo_surface_write_to_png而不使用SDL2,这条线清晰明了,但文字模糊。自爆图片是开罗和其他应用之间的文字比较。
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");