2017年7月22日土曜日

C# Magick.NETを使ってみる。リサイズ拡大縮小

C# Magick.NETを使ってみる
目次→http://1studying.blogspot.jp/2017/07/c-magicknetmokuzi.html#kuw12


リサイズ


画像の拡大縮小を行います。
%でリサイズ
                //%リサイズ
                myMagick.Resize(new ImageMagick.Percentage(50.0));

横%縦%でリサイズ
                //横%縦%でリサイズ
                myMagick.Resize(new ImageMagick.Percentage(50.0), new ImageMagick.Percentage(100.0));

指定Pixel以下の画像にリサイズ(縦横比率は変更無し)
                //指定Pixel以下の画像にリサイズ(縦横比率は変更無し)
                myMagick.Resize(500, 500);


サムネイル作成用リサイズ(高速縮小)
                //サムネイル作成時の高速縮小用
                //・「Thumbnail」は内部で以下の処理が自動で行う事により、
                // サムネイルの作成を高速処理させます。
                // 1)「myMagick.Strip()」Exif等の画像情報除去(但しICCプロファイルは削除しません)
                // 2)「myMagick.Sample(~)」画像をターゲットサイズの高さの5倍まで縮小
                // 3)「myMagick.Resize(~)」画像をターゲットサイズへ縮小
                myMagick.Strip();
                myMagick.Thumbnail(100,100);
                //圧縮率(0低圧縮~100高圧縮)JpegやPngに対応
                //myMagick.Quality = 0; 


高速リサイズ(通常は使用しない)
                //高速リサイズ(通常は使用しない)
                //「Resize」を簡略化、高速化版。「ピクセル平均化で縮小」あまり使用しません。
                //(200%や400%等の倍数拡大時、エッジがぼやけない)
                myMagick.Scale(new ImageMagick.Percentage(150.0));
                //「Resize」を簡略化、高速化版。「行列の複製削除リサイズ」。
                //(「Scale」よりも更に高速。
                // リサイズ時に色の追加や削除を行わない為、GIFアニメーションリサイズ時等で使用できる)
                myMagick.Sample(new ImageMagick.Percentage(150.0));


倍数拡大(まろやか綺麗)
1回実行する毎に倍に拡大されます。拡大時のエッジが非常にまろやかになります。
倍数拡大のみですが、新たな色の追加がなく、かなり綺麗に拡大されます。
使用例が以下に記載されています。
IM使用方法→http://www.imagemagick.org/Usage/resize/#magnify
使用例→http://www.scale2x.it/
                //倍数拡大(まろやか綺麗)
                myMagick.Magnify();
                myMagick.Magnify();
                //複数回使用が可能です。この例では400%拡大となります。


%でリサイズ(ぼけ最小、+-50%以内)
「Resize」時のぼけを最小にしたリサイズを行います。
但し、+−50%以内のみ有効です。
それ以外を入力すると、エイリアシングやモアレが発生します。
IM使用法→http://www.imagemagick.org/Usage/resize/#adaptive-resize
エイリアシングやモアレ→http://www.imagemagick.org/Usage/filter/#aliasing
                //%でリサイズ(ぼけ最小、+-50%以内)
                //(+-50%以内のみ有効。それ以外を入力すると、
                //エイリアシングやモアレが発生します。)
                myMagick.AdaptiveResize(new ImageMagick.MagickGeometry((int)Math.Round(myMagick.Width*1.5, MidpointRounding.AwayFromZero), (int)Math.Round(myMagick.Height * 1.5, MidpointRounding.AwayFromZero)));


シームカービングでリサイズ(画像印象を保持)
画像の印象をできる限り保持してリサイズを行う。
見た目に凄い機能ですが、画像の内容によっては不自然な歪みが生じます。
IM使用法→http://www.imagemagick.org/Usage/resize/#interpolative-resize
シームカービング→https://en.wikipedia.org/wiki/Seam_carving
YouTubeでのデモ→https://youtu.be/vIFCV2spKtg
                //シームカービングでリサイズ(画像印象を保持)
                //(画像内容によっては不自然な歪みが生じます)
                myMagick.LiquidRescale(new ImageMagick.Percentage(70.0), new ImageMagick.Percentage(100.0));



自由変形でリサイズ
自由変形を利用してリサイズを行います。
自由変形のアルゴリズムを選択できます。
「Resize」より結果が良くなる事がありますが、その分処理が重くなります。
(フィルターとの併用も可能っぽい?未確認。)
IM使用法→http://www.imagemagick.org/Usage/resize/#distort
IM使用法→http://www.imagemagick.org/Usage/distorts/#resize
                //自由変形でリサイズ
                double resizePercent = 1.0; //変倍率(100%→1.0)
                int out_Width = (int)Math.Round(myMagick.Width * resizePercent, MidpointRounding.AwayFromZero);
                int out_Height = (int)Math.Round(myMagick.Height * resizePercent, MidpointRounding.AwayFromZero);
                var param = new double[]
                {
                    0,0,                                //入力_左上座標
                    0,0,                                //出力_左上座標
                    0,myMagick.Height,                  //入力_左下座標
                    0,out_Height,                       //出力_左下座標
                    myMagick.Width,myMagick.Height,     //入力_右下座標
                    out_Width,out_Height,               //出力_右下座標
                    myMagick.Width,0,                   //入力_右上座標
                    out_Width,0                         //出力_右上座標
                };
                //自由変形
                //第2引数がtrueの場合は処理結果画像の全体を表示(RePage処理が必要となります)
                //第1引数で変換時のアルゴリズムを変更できます
                myMagick.Distort(ImageMagick.DistortMethod.Affine, true, param);
                //画像の位置をリセット
                myMagick.RePage();
                //上下左右に1pxelずつ無駄なPixelが追加される為、削除。
                myMagick.Crop(1, 1, out_Width, out_Height);



解像度の変更(縦横サイズ固定、縦横Pixel数変化)
画像の縦横のサイズを保ったまま解像度を変更した場合、
縦横のPixel数は変更解像度に従って変化します。
この時、内部でリサイズ処理が行われます。
IM使用時→http://www.imagemagick.org/Usage/resize/#resample
                //解像度の変更(縦横サイズ固定、縦横Pixel数変化)
                //縦横のサイズを保ったまま解像度を変更します。
                //その為、縦横のPixel数は指定解像度に従って変化します
                myMagick.Resample(300.0, 300.0);



%でリサイズ(フィルターを指定)
「Resize」時フィルターを使用する事で様々なアルゴリズムを使用できます。
例えばリサイズに「バイキュービック法」を使いたい場合は、
フィルターで「Cubic」を選択します。
IM使用時→http://www.imagemagick.org/Usage/filter/
フィルタ使用例→http://www.robotplanet.dk/graphics/imagemagick_scaling/
各フィルタのグラフ→http://sharp-bang.jp/prog/im.html
                //%リサイズ(フィルターを指定)
                //Pointフィルタは変倍時ボケが出ませんが、モアレが顕著に出ます。
                myMagick.FilterType = ImageMagick.FilterType.Point;
                myMagick.Resize(new ImageMagick.Percentage(150.0));
                myMagick.FilterType = ImageMagick.FilterType.Undefined;//初期値に戻す。






以下のサイトを参考にしました。

ImageMagickでのリサイズについて説明
http://www.imagemagick.org/Usage/resize/
ImageMagickでのピクセルの拡大縮小時の畳み込み方法等の説明
http://www.imagemagick.org/Usage/morphology/


リサイズ時、独自のアルゴリズムを制作「FCBI」
「Nearest-Neighbor」「Bi-Liner」「Bi-Cubic」「Lanczoz」「Mitchell」
アルゴリズムによる違いも書いてある。
https://blog.awm.jp/2017/03/07/fcbi/
https://blog.awm.jp/2017/03/08/fcbi/
https://blog.awm.jp/2017/03/11/fcbi/

画像のリサイズ時、
「Nearest Neighbor法」「Bilinear法」「Bicubic法」「Lanczos法」
http://koujinz.cocolog-nifty.com/blog/2009/04/post-b8e6.html

IMのリサイズについて結構詳細にまとめてくれている
http://freeparticle.hatenablog.com/entry/2015/01/16/230956

0 件のコメント:

コメントを投稿

↑Topへ