2012-08-06 3 views
2

다음 작업을 수행 할 필요가있는 작은 데모 응용 프로그램을 쓰고 있어요 사용하여 PNG 이미지를 저장 :도 의 X 번호에 의해 참조 PNG 이미지 파일 회전 카이로

  • 회전 PNG 이미지를

    1. 읽기
    2. 새 이미지를 애니메이션 프레임으로 저장
    3. 마지막 회전 결과가 회전 할 때까지 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 호출의 순서를 재 배열하려고 시도했을 것입니다. 아마 표면 또는 컨텍스트의 상태와 관련이 있다고 생각할 것입니다.

    (가) 시작과 끝 이미지는 다음과 같습니다

    Results

    나는 무엇을 놓치고?

  • 답변

    4

    원본 이미지를 그릴 표면으로 여는 중입니다. 원본 .png을 열고 소스로 을 통해 소스로 사용하고 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을 저장하는 파일을하고, 정리 작업을 수행 할 것입니다.

    +0

    대단히 감사합니다. 도움을 주셔서 감사 드리며 내가 잘못하고있는 것을 이해하고 있다고 생각합니다. – Chimera

    관련 문제