使用 cairo 进行缩放会导致绘制的图像出现在不同的位置

问题描述 投票:0回答:3

我有一个非常简单的设置: 一切都发生在放置在滚动窗口视口内的 GtkDrawingArea 的重写“draw”方法中。绘图区域大小为1000000x1000000。它绘制一个以绘图区域中心为中心的 pixbuf:

cairo_set_source_surface(cr, pixbufSurface, xPos, yPos); // middle center

cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_FAST);

cairo_paint_with_alpha(cr, transp);

问题是我必须使用

cairo_scale()
来简单地缩放绘制的pixbuf,同时仍然将其保持在相同的位置,但它却将其移动得很远。缩放是通过
scaleFactor
变量实现的。我怀疑我必须移动变换矩阵,并且我会强制使用一些值:

  1. cairo_translate(cr, -500000, -500000);
    如果scaleFactor 为2,则有效
  2. cairo_translate(cr, -1500000, -1500000);
    如果scaleFactor为4
  3. ,则有效

但我不知道这些数字是如何相互关联的。

c gtk scale transformation cairo
3个回答
1
投票

如果您首先位于位置 (x,y),并使用 z 进行缩放,那么您随后位于 (zx, zy)。

你在中心,所以在 (500000, 500000),所以如果你用 2 缩放,你最终会得到 (1000000, 1000000),如果你用 4 缩放,你最终会得到 (2000000, 2000000)

因此您可以使用 ((1-z) * 500000, (1-z) * 500000) 来转换回来

cairo_scale(cr, scaleFactor, scaleFactor); 
cairo_translate(cr, 500000 * (1-scaleFactor), 500000 * (1-scaleFactor));

您也可以先使用 (-500000, - 500000) 进行变换,然后进行缩放,然后再使用 (500000, 500000) 变换回来,但这仅在某些情况下有效。

cairo_translate(cr, -500000, -500000);
cairo_scale(cr, scaleFactor, scaleFactor); 
cairo_translate(cr, 500000, 500000);

只需检查其中是否有效,或者是否遇到其他问题。


0
投票

基本上是 Gnoom 所说的,并做了一些补充:

  1. 在绘制 pixbuf 之前执行
    cairo_scale(cr, z, z)
  2. 对于每个正在绘制的 pixbuf,在渲染之前添加
    cairo_translate(cr, (xpos*(1-z)/z), (ypos*(1-z)/z));
  3. 渲染后
    cairo_translate(cr, -(xpos*(1-z)/z), -(ypos*(1-z)/z));

0
投票

注意如果您在同一个 cairo 上下文中渲染多个图像,其中一些图像已缩放,请记住在每个缩放图像之前和之后保存并恢复 cr,否则缩放更改将在缩放图像之后绘制的后续图像中保留。我花了一段时间才解决这个问题...

        cairo_save (cr);
        
        ...

        cairo_restore (cr);
© www.soinside.com 2019 - 2024. All rights reserved.