У меня есть функция:
private static Image ScaleAndPadBlack(Image original_img, Thumbnail thumb)
{
if (thumb.OptimalSizeHeight <= 0)
{
throw new ArgumentOutOfRangeException("OptimalSizeHeight", "OptimalSizeHeight must be declared and positive when using the ScaleAndCrop method.");
}
if (thumb.OptimalSizeWidth <= 0)
{
throw new ArgumentOutOfRangeException("OptimalSizeWidth", "OptimalSizeWidth must be declared and positive when using the ScaleAndCrop method.");
}
Size dest_size = new Size(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight);
decimal act_width_rate = (decimal)dest_size.Width / (decimal)original_img.Width;
decimal act_height_rate = (decimal)dest_size.Height / (decimal)original_img.Height;
decimal scale_rate;
if (act_width_rate <= act_height_rate)
scale_rate = act_width_rate;
else
scale_rate = act_height_rate;
Size act_size = new Size(Convert.ToInt32(original_img.Width * scale_rate), Convert.ToInt32(original_img.Height * scale_rate));
var res = resizeImage(original_img, act_size);
var b = new Bitmap(thumb.OptimalSizeWidth, thumb.OptimalSizeHeight);
var g = Graphics.FromImage(b);
Point p = new Point(((dest_size.Width - act_size.Width) / 2), ((dest_size.Height - act_size.Height) / 2));
g.FillRectangle(Brushes.Black, new Rectangle(new Point(0, 0), dest_size));
g.SmoothingMode = SmoothingMode.None;
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.DrawImage(res, p);
res.Dispose();
res = null;
return b;
}
Что он делает, это изменяет размеры изображения, чтобы оно поместилось внутри ограничительной рамки, создав новое изображение, залейте его черным и поместите измененное изображение на черное изображение.
Проблема в том, что изменение размера полностью белого изображения jpg (761x896) в ограничивающем прямоугольнике 270x180 приводит к следующему:
Вы можете видеть, что в верхней части изображения есть серая полоса, потому что измененное изображение каким-то образом имеет прозрачный край.
Почему это происходит? Изменение размера изображения может привести к прозрачным краям? Это определенно не желательно в этом случае.
Или это верхний край, потому что есть какая-то другая причина?
Как мне написать эту функцию, чтобы в таких случаях не было черно-серых ребер? Я хочу только заполнить ту часть, где нет изображения, я должен сделать что-то совершенно по-другому?
EDIT:
g.SmoothingMode = SmoothingMode.None; g.InterpolationMode = InterpolationMode.NearestNeighbor; там, потому что я тестировал эту проблему. Кажется, они не имеют значения.