画像を読み込んでサイズを変更し、新しい背景に配置するルーチンがあります(新しいビットマップ、サイズが設定されているだけです)。
これはすべて完全に機能しますが、出力するPNGファイルのサイズを縮小したいと思います.JPEGファイルを出力すると、期待するファイルサイズが約4Kになりますが、PNGファイルのサイズは30Kを超えます.
PNG では JPEG レベルに到達できないことはわかっていますが、もう少しうまくやれると思います。
出力された PNG をFireworksにロードすると、背景とサイズ変更された画像がまだ別々のレイヤーであることに注意してください。Fireworks で PNG をフラット化すると、ファイルサイズが 5 ~ 10K ほど小さくなります。
まず、出力時に PNG をプログラムで平坦化する方法はありますか?
第二に、PNG サイズを縮小するために推奨できるものは他にありますか?
背景を透明のままにしたいので、PNGファイルを使用しています。
コード:
private static void ResizeImage(String ImageInPath, int MaxWidth, int MaxHeight, String ImageOutPath, Boolean PadImage, Color MyColour)
{
Bitmap MyImage = new Bitmap(ImageInPath);
Bitmap MyResizedImage = null;
int XPosition = 0;
int YPosition = 0;
float Ratio = MyImage.Width / (float)MyImage.Height;
int MyImageHeight = MyImage.Height;
int MyImageWidth = MyImage.Width;
if (MyImage.Width > MyImage.Height)
{
if (MyImage.Width > MaxWidth)
MyResizedImage = new Bitmap(MyImage, new Size(MaxWidth, (int)Math.Round(MaxWidth /
Ratio, 0)));
YPosition = (MaxHeight / 2) - (MyResizedImage.Height / 2);
}
else if (MyImage.Height > MyImage.Width)
{
if (MyImage.Height > MaxHeight)
MyResizedImage = new Bitmap(MyImage, new Size((int)Math.Round(MaxWidth * Ratio,
0), MaxHeight));
XPosition = (MaxWidth / 2) - (MyResizedImage.Width / 2);
}
if (PadImage)
{
Bitmap MyUnderlay = new Bitmap(MaxWidth, MaxHeight);
var Canvas = Graphics.FromImage(MyUnderlay);
Canvas.Clear(MyColour);
Canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
Canvas.DrawImage(MyResizedImage, XPosition, YPosition);
Canvas.Save();
if (MyColour == Color.Transparent)
{
MyUnderlay.Save(ImageOutPath + ".png", ImageFormat.Png);
}
else
{
MyUnderlay.Save(ImageOutPath, ImageFormat.Jpeg);
}
Canvas.Dispose();
MyUnderlay.Dispose();
}
else
{
MyResizedImage.Save(ImageOutPath, ImageFormat.Jpeg);
}
MyResizedImage.Dispose();
MyImage.Dispose();
}