Я разрабатываю приложение, используя .NET (4.5) MVC (4.0) C# (5.0). Я хочу сгенерировать изображение с изображением, которое у меня уже есть. Теперь требование похоже на то, что оно должно генерировать миниатюру максимальной квадратной части из центра изображения, не растягивая не целое изображение, кроме изображения квадратного размера.C# crop изображение из центра
как в примере моего размера исходного изображения: 578x700 я хочу создать миниатюру для размера заполнителя: 200x150, 185x138, 140x140, 89x66, 80x80, 45x45, 28x28
я был создать свой код, приведенный ниже, но не сделал получить точный результат. вот мой метод ядра, которые генерируют на миниатюру
public string GenerateThumbnailFromImage(string imageFilePath, int thumbWidth, int thumbHeight)
{
try
{
//Check if file exist
if (File.Exists(imageFilePath))
{
//bool preserveAspectRatio = true;
string oldFilePath = imageFilePath;
string folderPath = Path.GetDirectoryName(imageFilePath);
string filename = Path.GetFileNameWithoutExtension(imageFilePath);
//Rename file with thumbnail size
filename = filename + "_" + thumbWidth.ToString() + Path.GetExtension(imageFilePath);
imageFilePath = Path.Combine(folderPath, filename);
using (Image image = Image.FromFile(oldFilePath))
{
decimal originalWidth = image.Width;
decimal originalHeight = image.Height;
decimal requiredThumbWidth = thumbWidth;
decimal requiredThumbHeight = thumbHeight;
decimal startXPosition = 0;
decimal startYPosition = 0;
decimal screenWidth = originalWidth;
decimal screenHeight = originalHeight;
decimal ar = thumbWidth < thumbHeight
? originalWidth/originalHeight
: originalHeight/originalWidth;
//Define Starting Position for thumbnail generation
if (originalWidth > originalHeight)
startXPosition = (originalWidth - originalHeight)/2;
else if (originalHeight > originalWidth)
startYPosition = (originalHeight - originalWidth)/2;
if (thumbWidth>thumbHeight)
{
requiredThumbWidth = thumbWidth;
requiredThumbHeight = requiredThumbWidth*ar;
}
else if (thumbHeight>thumbWidth)
{
requiredThumbHeight = thumbHeight;
requiredThumbWidth = requiredThumbHeight*ar;
}
else
{
requiredThumbWidth = thumbWidth;
requiredThumbHeight = thumbWidth;
}
using (var bmp = new Bitmap((int)requiredThumbWidth, (int)requiredThumbHeight))
{
Graphics gr = Graphics.FromImage(bmp);
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.CompositingQuality = CompositingQuality.HighQuality;
gr.InterpolationMode = InterpolationMode.High;
var rectDestination = new Rectangle(0, 0, (int)requiredThumbWidth, (int)requiredThumbHeight);
gr.DrawImage(image, rectDestination, (int)startXPosition, (int)startYPosition, (int)screenWidth, (int)screenHeight, GraphicsUnit.Pixel);
bmp.Save(imageFilePath);
return filename;
}
}
}
return null;
}
catch (Exception ex)
{
GlobalUtil.HandleAndLogException(ex, this);
throw ex;
}
finally
{
}
}
«не получить точный результат» не очень описательный – Sayse
возможно дубликат [это] (Http: // StackOverflow.com/q/10242762/2256349) – Naren
@Naren Этот пост предназначен для обрезки миниатюры, если этот парень нуждается в изменении размера для миниатюры, тогда мой ответ ниже. –