Вы упоминаете изменение размера и обрезку.Если вы хотите, чтобы высота миниатюр варьировалась в зависимости от фиксированной ширины, приведенные ответы уже будут работать для вас.
Упоминание обрезки заставляет меня думать, что вам может потребоваться фиксированный размер миниатюр с заполненной шириной и любымпереполненная вертикальная часть обрезана.Если это так, вам нужно сделать немного больше работы.Недавно мне понадобилось что-то похожее, и это то, что я придумал.
Это создаст миниатюру оригинала, размер которой будет обрезан и обрезан таким образом, что исходное изображение полностью заполняет целевой эскиз, обрезая любыепереполнение.Внутри миниатюры не будет границ, даже если исходное соотношение и пропорции миниатюр отличаются.
public System.Drawing.Image CreateThumbnail(System.Drawing.Image image, Size thumbnailSize)
{
float scalingRatio = CalculateScalingRatio(image.Size, thumbnailSize);
int scaledWidth = (int)Math.Round((float)image.Size.Width * scalingRatio);
int scaledHeight = (int)Math.Round((float)image.Size.Height * scalingRatio);
int scaledLeft = (thumbnailSize.Width - scaledWidth) / 2;
int scaledTop = (thumbnailSize.Height - scaledHeight) / 2;
// For portrait mode, adjust the vertical top of the crop area so that we get more of the top area
if (scaledWidth < scaledHeight && scaledHeight > thumbnailSize.Height)
{
scaledTop = (thumbnailSize.Height - scaledHeight) / 4;
}
Rectangle cropArea = new Rectangle(scaledLeft, scaledTop, scaledWidth, scaledHeight);
System.Drawing.Image thumbnail = new Bitmap(thumbnailSize.Width, thumbnailSize.Height);
using (Graphics thumbnailGraphics = Graphics.FromImage(thumbnail))
{
thumbnailGraphics.CompositingQuality = CompositingQuality.HighQuality;
thumbnailGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
thumbnailGraphics.SmoothingMode = SmoothingMode.HighQuality;
thumbnailGraphics.DrawImage(image, cropArea);
}
return thumbnail;
}
private float CalculateScalingRatio(Size originalSize, Size targetSize)
{
float originalAspectRatio = (float)originalSize.Width / (float)originalSize.Height;
float targetAspectRatio = (float)targetSize.Width / (float)targetSize.Height;
float scalingRatio = 0;
if (targetAspectRatio >= originalAspectRatio)
{
scalingRatio = (float)targetSize.Width / (float)originalSize.Width;
}
else
{
scalingRatio = (float)targetSize.Height / (float)originalSize.Height;
}
return scalingRatio;
}
Чтобы использовать с вашим кодом, вы можете заменить свой вызов на OriginalImage.GetThumbnailImage
следующим:
imThumbnailImage = CreateThumbnail(OriginalImage, new Size(width, height));
Обратите внимание, что для портретных изображений этот код фактически сместит область просмотра миниатюры немного выше исходного изображения.Это было сделано для того, чтобы при создании эскизов портретные снимки людей не приводили к безголовым торсам.Если вам не нужна эта логика, просто удалите блок if
после комментария «портретный режим».