public Bitmap CreateMissile(Bitmap itemBitmap, MissileDirection direction) { MissileBitmapTransformation transformation = _transformations[direction]; Bitmap targetBitmap = new Bitmap(Program.MaxTileSize.Width, Program.MaxTileSize.Height); targetBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution); if (itemBitmap.Size == Program.ItemSize) { using (Graphics gTargetBitmap = Graphics.FromImage(targetBitmap)) { if (transformation.Rotation == 0f) { int x = (targetBitmap.Width - itemBitmap.Width) / 2; int y = (targetBitmap.Height - itemBitmap.Height) / 2; gTargetBitmap.DrawImage(itemBitmap, x, y); if (transformation.FlipHorizontally) { targetBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); } return(targetBitmap); } else { //Create square bitmap int sideLength = Math.Min(Program.MaxTileSize.Width, Program.MaxTileSize.Height); using (Bitmap centerBitmap = new Bitmap(sideLength, sideLength)) { centerBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution); using (Graphics gCenterBitmap = Graphics.FromImage(centerBitmap)) { int x = (centerBitmap.Width - itemBitmap.Width) / 2; int y = (centerBitmap.Height - itemBitmap.Height) / 2; gCenterBitmap.DrawImage(itemBitmap, x, y); } RotateSquareBitmap(targetBitmap, gTargetBitmap, centerBitmap, transformation); return(targetBitmap); } } } } else if (itemBitmap.Size == Program.MaxTileSize) { using (Graphics gTargetBitmap = Graphics.FromImage(targetBitmap)) { if (transformation.Rotation == 0f) { gTargetBitmap.DrawImage(itemBitmap, 0, 0); if (transformation.FlipHorizontally) { targetBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); } return(targetBitmap); } else { //Create square bitmap int sideLength = Math.Min(Program.MaxTileSize.Width, Program.MaxTileSize.Height); int x = (itemBitmap.Width - sideLength) / 2; int y = (itemBitmap.Height - sideLength) / 2; using (Bitmap centerBitmap = itemBitmap.Clone(new Rectangle(new Point(x, y), new Size(sideLength, sideLength)), itemBitmap.PixelFormat)) { centerBitmap.SetResolution(itemBitmap.HorizontalResolution, itemBitmap.VerticalResolution); using (Graphics gCenterBitmap = Graphics.FromImage(centerBitmap)) { gCenterBitmap.DrawImage(itemBitmap, x, y); } RotateSquareBitmap(targetBitmap, gTargetBitmap, centerBitmap, transformation); return(targetBitmap); } } } } else { throw new Exception(string.Format("Image for missile creations is of wrong size: {0}x{1}.", itemBitmap.Width, itemBitmap.Height)); } }
private void RotateSquareBitmap(Bitmap targetBitmap, Graphics gTargetBitmap, Bitmap centerBitmap, MissileBitmapTransformation transformation) { if (transformation.FlipHorizontally) { centerBitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); } using (Bitmap rotatedBitmap = new Bitmap(centerBitmap.Width, centerBitmap.Height)) { rotatedBitmap.SetResolution(centerBitmap.HorizontalResolution, centerBitmap.VerticalResolution); using (Graphics gRotatedBitmap = Graphics.FromImage(rotatedBitmap)) { gRotatedBitmap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; float middleX = (float)centerBitmap.Width / 2; float middleY = (float)centerBitmap.Height / 2; gRotatedBitmap.TranslateTransform(middleX, middleY); gRotatedBitmap.RotateTransform(transformation.Rotation); gRotatedBitmap.TranslateTransform(-1 * middleX, -1 * middleY); gRotatedBitmap.DrawImage(centerBitmap, new Point(0, 0)); int x = (targetBitmap.Width - rotatedBitmap.Width) / 2; int y = (targetBitmap.Height - rotatedBitmap.Height) / 2; gTargetBitmap.DrawImage(rotatedBitmap, x, y); } } }