-
Notifications
You must be signed in to change notification settings - Fork 1
/
Program.cs
94 lines (84 loc) · 3.17 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Drawing;
using System.IO;
namespace centerCropResize
{
internal class Program
{
private static void Main(string[] args)
{
int size;
if (args.Length != 2 || !int.TryParse(args[1], out size))
{
Console.WriteLine("Usage centerCropResize <filename> <size>");
return;
}
string filename = args[0];
if (!File.Exists(filename))
{
Console.WriteLine(filename + " not found.");
return;
}
Bitmap sourceImage = new Bitmap(filename);
int xMin = sourceImage.Width;
int yMin = sourceImage.Height;
int xMax = 0;
int yMax = 0;
//Iterate all pixels and determine the bounding box
//for non-transparent pixels only.
for (var y = 0; y < sourceImage.Height; y++)
{
for (var x = 0; x < sourceImage.Width; x++)
{
if (sourceImage.GetPixel(x, y).A != 0)
{
xMin = Math.Min(x, xMin);
yMin = Math.Min(y, yMin);
xMax = Math.Max(x, xMax);
yMax = Math.Max(y, yMax);
}
}
}
Rectangle sourceRect = new Rectangle(xMin, yMin, xMax - xMin, yMax - yMin);
//Create a new bitmap from the source image that only contains the non-transparent pixels.
using (Bitmap cropped = sourceImage.Clone(sourceRect, sourceImage.PixelFormat))
{
//Determine the size of the scaled image.
float floatWidth = cropped.Width;
float floatHeight = cropped.Height;
if (floatWidth > size)
{
floatHeight = floatHeight * (size / floatWidth);
floatWidth = size;
}
if (floatHeight > size)
{
floatWidth = floatWidth * (size / floatHeight);
floatHeight = size;
}
int drawWidth = (int)Math.Ceiling(floatWidth);
int drawHeight = (int)Math.Ceiling(floatHeight);
if (drawHeight != size && drawHeight % 2 != 0)
{
drawHeight++;
}
if (drawWidth != size && drawWidth % 2 != 0)
{
drawWidth++;
}
using (Bitmap output = new Bitmap(size, size, sourceImage.PixelFormat))
{
//Finally draw and scale the
using (Graphics g = Graphics.FromImage(output))
{
g.DrawImage(cropped, new Rectangle((size - drawWidth) / 2, (size - drawHeight) / 2, drawWidth, drawHeight));
}
//Dispose the source image so we can overwrite it.
sourceImage.Dispose();
//Save the result
output.Save(filename);
}
}
}
}
}