Ресайз для картинки - как сделать?

californie
Дата: 24.04.2007 23:03:27
есть контрол Image. В него загружаю картинку. Соответственно, размер контрола будет меняться в зависимости от разрешения картинки.
Но мне бы хотелось чтобы все картинки были представленны в строго определенном размере.
Можно это сделать путем установки width, height для контрола Image, однако при этом картинка будет растянута в зависимости от разрешения картинки, что делает картинку как бы отраженной в кривом зеркале. Мне этот эффект не нужен.
В Делфе есть такое св-во Adjust при котором картинка автоматически ресайзится чтобы влезть в установленные границы.
Каким способом это можно сделать в C#  ?
epicenter
Дата: 24.04.2007 23:09:39
вот тут http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=2492&tabindex=6 есть нечто "ресайзущее"... :)
californie
Дата: 24.04.2007 23:10:27
вопрос больше не актуален. ответ найден.
californie
Дата: 24.04.2007 23:11:51

"epicenter":
вот тут http://www.asp.net/ControlGallery/ControlDetail.aspx?Control=2492&tabindex=6 есть нечто "ресайзущее"... :)


спасибо. я сделал проще: выставил только height для картинки а width он подбирает сам

dazy
Дата: 25.04.2007 07:32:39
Если нужно сделать ресайз на саму исходную картинку, то можно вот так:

private static byte[] ResizeImageFile(byte[] imageFile, int targetSize) {
using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) {
Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) {
using (Graphics canvas = Graphics.FromImage(newImage)) {
canvas.SmoothingMode =
SmoothingMode.HighQuality;
canvas.InterpolationMode =
InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode =
PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage,
new Rectangle(new Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m,
ImageFormat.Png);
return m.GetBuffer();
}
}
}
}
private static Size CalculateDimensions(Size oldSize, int targetSize) {
Size newSize = new Size();
if (oldSize.Height > oldSize.Width) {
newSize.Width = (
int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
}
else {
newSize.Width = targetSize;
newSize.Height = (
int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}

Параметр targetSize - ограничение в пикселях по ширине или по высоте. Т.е. поставил 100, и все картинки будут вписываться в 100 пикселей.

Если менять размер у контрола Image, то размер картинки от этого не измениться, она, каждый раз будет грузиться полностью и масштабировать до размеров контрола.