2

我正在编写一个需要执行以下操作的小型演示应用程序:

  1. 读入参考PNG图像文件
  2. 将图像旋转PNGx 度数
  3. 将新图像另存为动画帧
  4. 最后旋转的结果返回到第 2 步,直到完成旋转。

结果应该是一系列PNG图像文件,以不同程度的旋转显示图像。然后这些图像会以某种方式组合成电影或动画GIF

我创建了以下代码尝试进行一次轮换:

#include <cairo.h>
#include <math.h>

/**** prototypes *******/
void Rotate( cairo_surface_t *image, int degress, const char *fileName );
double DegreesToRadians( double degrees );
/***********************/

double DegreesToRadians( double degrees )
{
    return((double)((double)degrees * ( (double)M_PI/(double)180.0 )));
}

void Rotate( cairo_surface_t *image, int degrees, const char *fileName )
{
    int w, h;
    cairo_t *cr;

    cr = cairo_create(image);
    w = cairo_image_surface_get_width (image);
    h = cairo_image_surface_get_height (image);

    cairo_translate(cr, w/2.0, h/2.0);
    cairo_rotate(cr, DegreesToRadians( degrees ));
    cairo_translate(cr, - w/2.0, -h/2.0);

    cairo_set_source_surface(cr, image,  0, 0);
    cairo_paint (cr);


    cairo_surface_write_to_png(image, fileName );
    cairo_surface_destroy (image);
    cairo_destroy(cr);  
}

int main()
{
    cairo_surface_t *image = cairo_image_surface_create_from_png ("images/begin.png");
    Rotate(image, 90, "images/end.png");
    return( 0 );
}

问题是原始图像旋转 90 度后,生成的保存图像旋转但不完全正确。我尝试重新排列cairo调用的顺序,认为这可能与表面状态或上下文有关。

开始和结束图像如下所示:

结果

我错过了什么?

4

1 回答 1

4

您正在打开原始图像作为要绘制的表面。打开您的原始 .png 并将其用作cairo_set_source_surface,然后将其绘制到通过 创建的新的空图像表面上cairo_image_surface_create

从替换开始:

cr = cairo_create(image);
w = cairo_image_surface_get_width (image);
h = cairo_image_surface_get_height (image);

和:

w = cairo_image_surface_get_width (image);
h = cairo_image_surface_get_height (image);
cairo_surface_t* tgt = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);

cr = cairo_create(tgt);

那么当然,你会想要保存文件,而tgt不是image文件,然后进行清理。

于 2012-08-06T20:30:12.593 回答