45557


都合によりImageMagickは使用できません。C言語で実装する必要があります。

<https://stackoverflow.com/questions/11834243/rotate-and-save-png-image-using-
cairo>

本家の方で似た質問があったので試してみたのですが、回転後の画像はなぜか回転前と全く同じでした。


CC BY-SA 4.0
2018-07-12T09:56:39.313
45554
2018-07-13T23:32:26.897
17238
question
linux c
cairoでPNG画像を90, 180, 270度回転して保存したい


参考にされている質問・応答に足りていない点といえば、 **cairo_surface_write_to_pngにtgtを渡す**
点だと思いますが、それを忘れているのでは。  
(質問文そのままだとソースイメージを書き出しているので、結果は変わりません)

念の為、こんな感じでできます。

[code]

    #include <cairo.h>
    
    int main()
    {
        cairo_surface_t *source;
        cairo_surface_t *dest;
        cairo_t *cr;
        int width, height;
    
        source = cairo_image_surface_create_from_png("source.png");
        width = cairo_image_surface_get_width(source);
        height = cairo_image_surface_get_height(source);
        dest = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
        cr = cairo_create(dest);
        cairo_translate(cr, width / 2.0, height / 2.0);
        cairo_rotate(cr, 3.14159 / 180.0 * 90.0);
        cairo_translate(cr, -width / 2.0, -height / 2.0);
        cairo_set_source_surface(cr, source, 0, 0);
        cairo_paint(cr);
    
        cairo_surface_write_to_png(dest, "result.png");
        cairo_destroy(cr);
        cairo_surface_destroy(dest);
        cairo_surface_destroy(source);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-07-12T11:07:43.183
45555
2018-07-12T11:07:43.183
15473
45554
answer


コメントより:

> ただ、このサンプルは縦横の解像度が同じ場合しか期待通りにならないですね。ペイントアプリで90度回転させたような見た目にするのは難しいでしょうか？
[code]

    dest = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
    
[/code]

なので、回転前とサイズが変わっていない場合にしか対応できていないのでしょう。

「ペイントアプリ」を知りませんが、以下でいかがでしょうか?  
katsuko さんの回答を元に手を加えてみました。

[code]

    #include <cairo.h>
    
    /* 90, 180, 270 */
    #define DEGREE 270
    
    int main()
    {
        cairo_surface_t *source;
        cairo_surface_t *dest;
        cairo_t *cr;
        int width, height;
    
        source = cairo_image_surface_create_from_png("source.png");
        width = cairo_image_surface_get_width(source);
        height = cairo_image_surface_get_height(source);
    #if DEGREE == 180
        dest = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
    #else
        dest = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, height, width);
    #endif
        cr = cairo_create(dest);
    #if DEGREE == 90
        cairo_translate(cr, height, 0);
        cairo_rotate(cr, 3.14159 / 2.0);
    #elif DEGREE == 180
        cairo_translate(cr, width, height);
        cairo_rotate(cr, 3.14159);
    #else
        cairo_translate(cr, 0, width);
        cairo_rotate(cr, 3.14159 / -2.0);
    #endif
        cairo_set_source_surface(cr, source, 0, 0);
        cairo_paint(cr);
    
        cairo_surface_write_to_png(dest, "result.png");
        cairo_destroy(cr);
        cairo_surface_destroy(dest);
        cairo_surface_destroy(source);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-07-12T13:50:07.147
45557
2018-07-13T23:32:26.897
2018-07-13T23:32:26.897
5288
5288
45554
answer