У меня есть папка, содержащая около 2500 изображений PNG, без прозрачности. Каждое изображение размером около 500 x 500 (некоторые 491 x 433, другие 511 x 499 и т. Д.).
Я хочу постепенно уменьшить каждое изображение до 10% от его исходного размера и установить белый фон каждого изображения в качестве прозрачного цвета.
Чтобы протестировать функциональность моего приложения без изменения размера 2500 изображений каждый раз, я использовал 15 изображений бильярдных шаров в качестве «тестовой» папки.
Теперь моя проблема со следующим кодом, я получаю PNG с измененным размером и обрезкой, с почти прозрачным фоном. Проблема в том, что белая рамка слева и сверху появляется в каждом окне просмотра изображений (Irfan View, Paint.Net и GIMP)
Как мне избежать этой границы?
Вот код, который я использовал для этого:
void ResizeI(string[] Paths, string OutPut, Methods m, PointF Values, bool TwoCheck, bool Overwrite, float[] CropVals)
{
for (int i = 0; i < Paths.Length; i++)//Paths is the array of all images
{
string Path = Paths[i];//current image
Bitmap Oimg = (Bitmap)Bitmap.FromFile(Path);//original image
Bitmap img = new Bitmap((int)(Oimg.Width - CropVals[0] - CropVals[1]), (int)(Oimg.Height - CropVals[2] - CropVals[3]));//cropped image
Graphics ggg = Graphics.FromImage(img);
ggg.DrawImage(Oimg, new RectangleF(((float)-CropVals[0]), ((float)-CropVals[2]), Oimg.Width - CropVals[1], Oimg.Height - CropVals[3]));
ggg.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
ggg.Dispose();
PointF scalefactor = GetScaleFactor(img, Values, TwoCheck);//the scale factor equals 0.1 for 10%
Bitmap newimg = new Bitmap((int)(Math.Ceiling(((float)img.Width) * scalefactor.X)), (int)(Math.Ceiling(((float)img.Height) * scalefactor.Y)));
System.Drawing.Imaging.ImageFormat curform = img.RawFormat;
string OutPath = System.IO.Path.Combine(OutPut, System.IO.Path.GetFileName(Path));
OutPath = CheckPath(OutPath, Overwrite);//Delete if exsits
Graphics g = Graphics.FromImage(newimg);
g.InterpolationMode = GetModeFromMethod(m);//Bicubic interpolation
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.ScaleTransform(scalefactor.X, scalefactor.Y);
g.DrawImage(img, new Rectangle(0, 0, (int)Math.Ceiling(((float)newimg.Width) / scalefactor.X) + 1, (int)Math.Ceiling(((float)newimg.Height) / scalefactor.Y) + 1));
//g.Flush(System.Drawing.Drawing2D.FlushIntention.Flush);
newimg.MakeTransparent(Color.White);
newimg.Save(OutPath, curform);
g.Dispose();
img.Dispose();
}
}
А вот пример белой границы, которую я упомянул. Загрузите изображение или перетащите его и поместите под него черный фон, чтобы увидеть границу:
- РЕДАКТИРОВАТЬ -
Мне удалось написать эту функцию вместо newimg.MakeTransparent(...)
:
void SetTransparent(ref Bitmap b)
{
for (int i = 0; i < b.Width; i++)
{
for (int ii = 0; ii < b.Height; ii++)
{
Color cc = b.GetPixel(i, ii);
int tog = cc.R + cc.G + cc.B;
float durch = 255f - (((float)tog) / 3f);
b.SetPixel(i, ii, Color.FromArgb((int)durch, cc.R, cc.G, cc.B));
}
}
}
проблема в том, что мой бильярдный шар теперь выглядит так: