У меня есть очень большие рисунки здания, иногда 22466x3999 с бит глубиной 24 или даже больше. Мне нужно иметь возможность изменять их размер до меньших версий и иметь возможность вырезать части изображения на более мелкие изображения.C# Обрезка и изменение размера больших изображений
Я использую следующий код, чтобы изменить размер изображения, которые я нашел here:
public static void ResizeImage(string OriginalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider)
{
System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFile);
if (OnlyResizeIfWider)
{
if (FullsizeImage.Width <= NewWidth)
{
NewWidth = FullsizeImage.Width;
}
}
int NewHeight = FullsizeImage.Height * NewWidth/FullsizeImage.Width;
if (NewHeight > MaxHeight)
{
NewWidth = FullsizeImage.Width * MaxHeight/FullsizeImage.Height;
NewHeight = MaxHeight;
}
System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);
FullsizeImage.Dispose();
NewImage.Save(NewFile);
}
И этот код, чтобы обрезать изображения:
public static MemoryStream CropToStream(string path, int x, int y, int width, int height)
{
if (string.IsNullOrWhiteSpace(path)) return null;
Rectangle fromRectangle = new Rectangle(x, y, width, height);
using (Image image = Image.FromFile(path, true))
{
Bitmap target = new Bitmap(fromRectangle.Width, fromRectangle.Height);
using (Graphics g = Graphics.FromImage(target))
{
Rectangle croppedImageDimentions = new Rectangle(0, 0, target.Width, target.Height);
g.DrawImage(image, croppedImageDimentions, fromRectangle, GraphicsUnit.Pixel);
}
MemoryStream stream = new MemoryStream();
target.Save(stream, image.RawFormat);
stream.Position = 0;
return stream;
}
}
Моя проблема заключается в том, что я получаю Sytem.OutOfMemoryException, когда я пытаюсь изменить размер изображения, и это потому, что я не могу загрузить полное изображение в FullsizeImage.
Итак, что бы я хотел знать, как изменить размер изображения без загрузки всего изображения в память?
Это не решение программирования, но вы могли бы попробовать увеличить * виртуальной памяти * размер вашей машины и посмотреть. – Kurubaran
Вы должны работать с LockBits для таких размеров изображений – Vajura
@Kurubaran Я пытался увеличить объем памяти, который не работал, и я не думаю, что это правильное решение для веб-проекта. –