PNG画像を組み合わせて画像を吐き出す
仕事で「画像ファイルは提供します。組み合わせはそっちで作ってください」と言うことになり、PNGファイルを組み合わせた画像を大量に作る作業が発生したので、C#でちゃらっと書いてみました。(仕事の方だと組み合わせの数が跳ね上がるので、一部関数にする可能性大ですが、参考にはなろうという意味で置いておきます)
サンプルコードを見てみてはじめ意味がわからなかったんですが、GraphicsオブジェクトがBitmapオブジェクトに書き込みやってるんですね。
(リファクタリングしました。まだ読みにくいなぁ)
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; namespace PicLay { class Program { static void Main(string[] args) { var pics = new List<string> { @"E:\temp\PicLaySample\01.png", //画像1〜3 @"E:\temp\PicLaySample\02.png", @"E:\temp\PicLaySample\03.png", @"E:\temp\PicLaySample\04.png", @"E:\temp\PicLaySample\base.png" //背景画像 }; var inPicNum = pics.Count-1; var picNum = Math.Pow(2, inPicNum); for(var i=1;i< picNum; i++) //iは出力ファイル名。各ビットの1に対してPNGを合成する。 { using (var resultPic = new Bitmap(pics.Last())) //背景画像作成 { var g = Graphics.FromImage(resultPic); for (var j = 0; j < inPicNum; j++) //各画像の書き込みチェック { if ((i & (int)(Math.Pow(2,j))) != 0) //対象が書き込み画像であれば { using (var addPic = new Bitmap(pics[j])) { g.DrawImage(addPic, 0, 0, addPic.Width, addPic.Height); } } } //書き出し var fileName = i.ToString("D3") + ".png"; var targetName = @"E:\temp\PicLaySample\test" + Path.DirectorySeparatorChar + fileName; resultPic.Save(targetName, ImageFormat.Png); } } } } }