示例#1
0
apr_status_t
dims_flipflop_operation (dims_request_rec *d, char *args, char **err) {
    if(args != NULL) {
        if(strcmp(args, "horizontal") == 0) {
            MAGICK_CHECK(MagickFlopImage(d->wand), d);
        } else if (strcmp(args, "vertical") == 0) {
            MAGICK_CHECK(MagickFlipImage(d->wand), d);
        }
    }

    return DIMS_SUCCESS;
}
示例#2
0
void flip(char* input,char* output)
{
        printf("x-axis mirror\n");
        MagickWand *m_wand = NULL;


        MagickWandGenesis();

        m_wand = NewMagickWand();
        //open
        MagickReadImage(m_wand,input);
        //flip
	MagickFlipImage(m_wand);
        //save
        MagickWriteImage(m_wand,output);

        /* Clean up */
        if(m_wand)m_wand = DestroyMagickWand(m_wand);

        MagickWandTerminus();
}
//---------------------------------------------------------------------
//		出力プラグイン処理本体
//---------------------------------------------------------------------
BOOL func_output( OUTPUT_INFO *oip )
{
    const double mabiki = 1;    //2にすると2フレーム中1フレームの間引き
                                //intだと四捨五入の計算ができない
    if( oip->n > 500 / mabiki )
        if( MessageBox( NULL, (LPCSTR) "大量のフレームが選択されています。\n本当に続行しますか?", (LPCSTR) "アニメーションGIF出力プラグイン", MB_YESNO | MB_ICONQUESTION )
            == IDNO )
            return TRUE;
    
    const int delay = round( mabiki * 100 * oip->scale / oip->rate );    //間引き×100÷フレームレートを四捨五入
    MagickWandGenesis();
    MagickWand *dest = NewMagickWand();
    
    for( int i = 0; i < oip->n; i = i + mabiki )
    {
        if( oip->func_is_abort() )
        {
            if( MessageBox( NULL, (LPCSTR) "ここまでの出力データをアニメーションGIFに書き込みますか?", (LPCSTR) "アニメーションGIF出力プラグイン", MB_YESNO | MB_ICONQUESTION )
                == IDYES )
                break;
            else
            {
                DestroyMagickWand( dest );
                MagickWandTerminus();
                return TRUE;
            }
        }
        oip->func_rest_time_disp( i, oip->n );
        
        int copy = 0;    //コピーフレーム数
        for( int j = 1; i + j < oip->n; j++ )
        {
            if( oip->func_get_flag( i + j ) & OUTPUT_INFO_FRAME_FLAG_COPYFRAME )
                copy++;
            else
                break;
        }
        
        MagickWand *source = NewMagickWand();
        if( !MagickConstituteImage( source, oip->w, oip->h, "BGR", CharPixel, oip->func_get_video_ex( i, 0 ) ) )    //NULLだと警告
            MessageBox( NULL, (LPCSTR) "データ取得失敗", (LPCSTR) "アニメーションGIF出力プラグイン", MB_OK|MB_ICONSTOP );
        MagickFlipImage( source );    //AviUtlからはボトムアップで渡されるが、MagickConstituteImageはトップダウン固定
        MagickSetImageDelay( source, delay * ( copy + 1 ) );    //コピーフレーム数0なら1倍
        //MagickSetImageDispose( source, 0 );
        MagickAddImage( dest, source );
        DestroyMagickWand( source );
        i = i + copy;    //コピーフレーム数分だけ先送り
        oip->func_update_preview();
    }
    MagickSetFirstIterator( dest );
    MagickQuantizeImages( dest, 256, RGBColorspace, 0, FloydSteinbergDitherMethod, MagickFalse );
    //MagickSetFirstIterator( dest );
    //MagickSetImageIterations( dest, 0 );
    if( !MagickSetFormat( dest, "GIF" ) )
        MessageBox( NULL, (LPCSTR) "GIFセット失敗", (LPCSTR) "アニメーションGIF出力プラグイン", MB_OK|MB_ICONSTOP );
    dest = MagickOptimizeImageLayers( MagickCoalesceImages( dest ) );    //ここでdisposeが1になる
    MagickOptimizeImageTransparency( dest );    //6.7.8-7以降が必要
    if( !MagickWriteImages( dest, oip->savefile, MagickTrue ) )
        MessageBox( NULL, (LPCSTR) "出力失敗", (LPCSTR) "アニメーションGIF出力プラグイン", MB_OK|MB_ICONSTOP );
    
    DestroyMagickWand( dest );
    MagickWandTerminus();
    return TRUE;
}