2

私は次のことを行う必要がある小さなデモアプリケーションを書いています:

  1. 参照PNG画像ファイルを読み込む
  2. PNG画像をx度回転します
  3. 新しい画像をアニメーションのフレームとして保存します
  4. 最後の回転の結果で、回転が完了するまでステップ2に戻ります。

結果は、さまざまな回転角度での画像を示す一連のPNG画像ファイルになります。これらの画像は、何らかの形で映画またはアニメーションに結合されGIFます。

1回転を試みる次のコードを作成しました。

#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 に答える