C++ 开罗:模糊的形状和文字

C++ 开罗:模糊的形状和文字,c++,performance,graphics,cairo,blurry,C++,Performance,Graphics,Cairo,Blurry,我在它的图像表面绘制了一些随机矩形,缩放和转换它,并使用 unsigned char* data = cairo_image_surface_get_data(surface); 但是矩形看起来很模糊: (我无法发布截图) 角点(可能)未映射到整数坐标。包含数据的纹理与曲面的大小和格式相同,我已经使用了抗锯齿设置(文本显示更加模糊!!)。如何将生成的形状映射到整数坐标并提高质量(不使用超级采样和不删除缩放平移) 编辑:我使用了下面的代码(有第三行和没有第三行),但它不起作用 cairo_sav

我在它的图像表面绘制了一些随机矩形,缩放和转换它,并使用

unsigned char* data = cairo_image_surface_get_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);
编辑2:我用了抓拍的乐趣。(在所有代码转换之后),但它也不起作用:

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

如果不预处理坐标,就无法强制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);
}
笔划宽度也会有同样的问题(+如果
width!=height
,则在
x,y中不同)


更多信息参见

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

func(me*画布)DrawRectF(左、上、右、下浮动32,绘制*绘制){

如果正确我知道这不是cairo的问题,但是SDL2,SDL2需要设置
SDL\u WINDOW\u ALLOW\u HIGHDPI
来显示单个像素线,但是我发现了一个问题,这次我使用cairo\u surface\u write\u to\u png而不使用SDL2,线清晰明亮,但文本模糊。图片是cairo和其他应用程序之间的文本比较。

cairo\u surface\u t*surface;
开罗*cr;
surface=cairo\u image\u surface\u create(cairo\u格式\u argb32100100);
cr=cairo_创建(曲面);
cairo_set_source_rgb(cr,0.0,0.0,0.0);
开罗漆(cr);
cairo\u text\u区段\u t区段;
const char*utf8=“bullry text”;
双x,y;
printf(“x=%f,y=%f”,x,y);
snapToPixel(cr、x和y);
printf(“x=%f,y=%f”,x,y);
//cairo\u set\u antialias(cr,cairo\u antialias\u BEST);
cairo\u选择字体\u面(cr,“单声道”,
开罗字体倾斜法线,
开罗(字体、重量、正常);
cairo_set_font_size(cr,14.0);
cairo\u text\u区段(cr、utf8和区段);
x=128.0-(范围宽度/2);
y=128.0-(范围高度/2);
开罗移动到(cr,0,15);
cairo_set_source_rgba(cr,1,1,1,1);
cairo\u show\u text(cr,utf8);
/*画帮助线*/
cairo\u set\u source\u rgb(cr,1,0,0);
cairo_集_线_宽度(cr,1.0);
cairo_矩形(cr,20.5,20.5,50,50);
脑卒中(cr);
cairo_surface_write___png(surface,“./a.png”);

不幸的是,它不起作用(@请参见编辑);我正在绘图之前缩放和转换…@user3648895基于您的编辑,您的坐标(用于绘图)从0.0到1.0?是的,我以单位坐标绘制所有图纸,并在需要时进行缩放转换;我希望cairo能够处理这一点,因为它是一个向量库。顺便说一句,感谢您的兴趣。这不是cairo的问题,这是SDL2的问题。添加
SDL_WINDOW_ALLOW_HIGHDPI
CreateWindow
时,这可能是个问题关于(底层)字体绘图库,如freetype。高质量字体/字形渲染需要抗锯齿、亚像素渲染(LCD)等技术。