2017年7月22日土曜日

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

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


リサイズ


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

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

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


サムネイル作成用リサイズ(高速縮小)
サムネイル作成用リサイズ
1
2
3
4
5
6
7
8
9
10
//サムネイル作成時の高速縮小用
//・「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;


高速リサイズ(通常は使用しない)
高速リサイズ
1
2
3
4
5
6
7
8
//高速リサイズ(通常は使用しない)
//「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/
倍数拡大(まろやか綺麗)
1
2
3
4
//倍数拡大(まろやか綺麗)
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%以内)
1
2
3
4
//%でリサイズ(ぼけ最小、+-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
シームカービングでリサイズ(画像印象を保持)
1
2
3
//シームカービングでリサイズ(画像印象を保持)
//(画像内容によっては不自然な歪みが生じます)
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
自由変形でリサイズ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//自由変形でリサイズ
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数変化)
1
2
3
4
//解像度の変更(縦横サイズ固定、縦横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
%でリサイズ(フィルターを指定)
1
2
3
4
5
//%リサイズ(フィルターを指定)
//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へ