Изменение размера изображения в C#

Язык программирования C#

Очень часто при добавлении изображений в проект приходится изменять размеры изображения, и часто хочется это делать грамотно, с сохранением пропорций изображения. Лично мне часто бывает надо вставить картинки в ListView допустим и ужать их правильно (так чтобы не расползлись в квадрат заданных размеров). Именно в этом деле и поможет написанная ниже процедура.

Процедура изменения размеров:

static Image ScaleImage(Image source, int width, int height)
        {
         
            Image dest = new Bitmap(width, height);
            using (Graphics gr = Graphics.FromImage(dest))
            {
                gr.FillRectangle(Brushes.White, 0, 0, width, height);  // Очищаем экран
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

                float srcwidth = source.Width;
                float srcheight = source.Height;
                float dstwidth = width;
                float dstheight = height;

                if (srcwidth <= dstwidth && srcheight <= dstheight)  // Исходное изображение меньше целевого
                {
                    int left = (width - source.Width) / 2;
                    int top = (height - source.Height) / 2;
                    gr.DrawImage(source, left, top, source.Width, source.Height);
                }
                else if (srcwidth / srcheight > dstwidth / dstheight)  // Пропорции исходного изображения более широкие
                {
                    float cy = srcheight / srcwidth * dstwidth;
                    float top = ((float)dstheight - cy) / 2.0f;
                    if (top < 1.0f) top = 0;
                    gr.DrawImage(source, 0, top, dstwidth, cy);
                }
                else  // Пропорции исходного изображения более узкие
                {
                    float cx = srcwidth / srcheight * dstheight;
                    float left = ((float)dstwidth - cx) / 2.0f;
                    if (left < 1.0f) left = 0;
                    gr.DrawImage(source, left, 0, cx, dstheight);
                }

                return dest;
            }
        }


А теперь пример того как это можно ещё использовать. Пример впихивает изображение в квадрат 200х200 пропорционально сжимая его предварительно при помощи примера выше, и обводя это всё чёрной рамкой.

static Image ScaleImageMain(Image img)
        {
            int x1 = 200;
            int y1 = 200;
            int x2 = 3;
            int y2 = 3;
            if (img.Width > img.Height)
            {
                x1 = 200;
                y1 = (int)Math.Round((double)img.Height / (img.Width / 200));
                y2 = (int)Math.Round((double)((200 - y1) / 2));

            }
            else
            {
                if (img.Width < img.Height)
                {
                    y1 = 200;
                    x1 = (int)Math.Round((double)img.Width / (img.Height / 200));
                    x2 = (int)Math.Round((double)((200 - x1) / 2));
                }
            }
            img = ScaleImage(img, x1, y1);
            Image dest = new Bitmap(208, 208);
            Graphics gr = Graphics.FromImage(dest);
            // Здесь рисуем рамку.
            Pen blackPen = new Pen(Color.Black, 3);
            float x = 0.0F;
            float y = 0.0F;
            float width = 208.0F;
            float height = 208.0F;
            gr.DrawRectangle(blackPen, x, y, width, height);

            gr.DrawImage(img, x2, y2, img.Width, img.Height);
            
            return dest;
        }

изменения размеров Image С шарп

Комментарии:

it-serv 24 May 2011, 02:00 0 0

Приветствую.
А можете выложить наглядный пример?

Ответить
it-serv 24 May 2011, 02:06 0 0

Забыл уточнить.
Не получается сохранить в файл получаемое изображение.

Ответить
Roman 25 May 2011, 01:58 0 0

Для начала здесь посмотреть, может проблема в этом.

И вот пример на всякий случай:

Скачать можно здесь: ScaleImageTest.rar

Ответить