californie
Дата: 24.04.2007 23:03:27
есть контрол Image. В него загружаю картинку. Соответственно, размер контрола будет меняться в зависимости от разрешения картинки.
Но мне бы хотелось чтобы все картинки были представленны в строго определенном размере.
Можно это сделать путем установки width, height для контрола Image, однако при этом картинка будет растянута в зависимости от разрешения картинки, что делает картинку как бы отраженной в кривом зеркале. Мне этот эффект не нужен.
В Делфе есть такое св-во Adjust при котором картинка автоматически ресайзится чтобы влезть в установленные границы.
Каким способом это можно сделать в C# ?
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, то размер картинки от этого не измениться, она, каждый раз будет грузиться полностью и масштабировать до размеров контрола.