大量の画像をリサイズする。ただしフォルダ構成は変えない
using System; using System.Threading.Tasks; using System.IO; using System.Windows.Media; using System.Windows.Media.Imaging; namespace ResizePics { class Program { const string SRC_DIR = @"E:\temp\SRCDIR"; const string DST_DIR = @"E:\temp\DSTDIR"; const double TARGET_WIDTH = 1000; static void Main(string[] args) { //対象ファイル取得 var pictures = Directory.GetFiles(SRC_DIR, "*.jpg", SearchOption.AllDirectories); var pOptions = new ParallelOptions(); pOptions.MaxDegreeOfParallelism = 2; Parallel.ForEach(pictures,pOptions, srcFile => { Console.WriteLine(srcFile); //ファイルを開いて縮小する using (var srcStream = File.OpenRead(srcFile)) { var decoder = BitmapDecoder.Create(srcStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); var bitmapSource = decoder.Frames[0]; //縮小したビットマップを作成する var scale = TARGET_WIDTH / bitmapSource.PixelWidth; //縮小率 var scaledBitmapSource = new TransformedBitmap(bitmapSource, new ScaleTransform(scale, scale)); var encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(scaledBitmapSource)); //ファイルの書き出し var dstFile = Microsoft.VisualBasic.Strings.Replace(srcFile, SRC_DIR, DST_DIR, 1, 1); //ディレクトリがなければ作成する if(!Directory.Exists(Path.GetDirectoryName(dstFile))) { Directory.CreateDirectory(Path.GetDirectoryName(dstFile)); } using (var dstStream = File.OpenWrite(dstFile)) { encoder.Save(dstStream); } } }); Console.WriteLine("END"); Console.ReadLine(); } } }
基本的にこちらとやっていることは同じ。
http://note-sharp.blogspot.jp/2014/09/var-dir-cimages-parallel.html
Out of memoryが出たのでParallelに制限をかけたのと、pixelwidthに変更しただけです。