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; }
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; }