.NET рисование изотропных изображений - PullRequest
1 голос
/ 14 января 2010

Кто-нибудь имеет представление о том, как изотропно изменить размер изображения? То есть я задаю ему ширину / высоту, и изображение масштабируется так, чтобы оно соответствовало пропорциям внутри этого поля, даже если вокруг него есть пробелы?

Ответы [ 3 ]

2 голосов
/ 14 января 2010

нашел его:

    public Image ResizeIsotropic(Image src, Size sz)
    {
        double d1 = sz.Width / (double)sz.Height;
        double d2 = src.Width / (double)src.Height;

        if (d1 > d2)
        {
            src = ResizeByHeight(src, sz.Height);
        }
        else
        {
            src = ResizeByWidth(src, sz.Width);
        }

        Image rtn = null;
        using (Image thumbnail = new Bitmap(sz.Width, sz.Height, PixelFormat.Format32bppArgb))
        {
            using (Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail))
            {
                graphic.FillRectangle(Brushes.White, 0, 0, sz.Width, sz.Height);
                graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphic.CompositingQuality = CompositingQuality.HighQuality;
                graphic.DrawImage(src, (sz.Width - src.Width)/2, (sz.Height - src.Height)/2, src.Width, src.Height);
                EncoderParameters encoderParameters;
                encoderParameters = new EncoderParameters(1);
                ImageCodecInfo jpginfo = GetImageCodecInfo(ImageFormat.Jpeg);
                encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, Quality);
                MemoryStream ms = new MemoryStream();
                thumbnail.Save(ms, jpginfo, encoderParameters);
                rtn = Image.FromStream(ms);
            }
        }

        theImage = rtn;
        return rtn;
    }


    private ImageCodecInfo GetImageCodecInfo(ImageFormat format)
    {
        ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
        ImageCodecInfo jpginfo = null;
        foreach (ImageCodecInfo i in info)
        {
            if (i.FormatID == format.Guid)
            {
                jpginfo = i;
                break;
            }
        }
        return jpginfo;
    }

функции ResizeByWidth и ResizeByHeight - это другие части библиотеки, которые у меня есть, они делают именно то, о чем вы думаете.

вот результаты:

альтернативный текст http://imagebin.antiyes.com/images/0626614001263432575_87.jpg

0 голосов
/ 14 января 2010

Хотя я считаю ответ Джона Бокера достаточным, это может быть более краткий способ сделать это:

static Bitmap ResizeIsotropic(Image img, Size newSize, Color backgroundColor)
{
  int Width, Height;

  if (img.Width >= img.Height)
  {
    Width = newSize.Width;
    Height = (int)(img.Height / (img.Width / Width));
  }
  else
  {
    Height = newSize.Height;
    Width = (int)(img.Width / (img.Height / Height));
  }

  Bitmap bmp = new Bitmap(newSize.Width, newSize.Height);

  using (Graphics gfx = Graphics.FromImage(bmp))
  {
    gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    gfx.Clear(backgroundColor);
    gfx.DrawImage(img, (bmp.Width / 2) - (Width / 2), (bmp.Height / 2) - (Height / 2), Width, Height);
  }

  return bmp;
}

Затем, чтобы позвонить, просто сделайте:

Bitmap bmp = ResizeIsotropic(Image.FromFile(@"c:\yourImage.jpg"), new Size(512, 512), Color.Black);
bmp.Save(@"c:\test.bmp");
0 голосов
/ 14 января 2010

Да. Сначала рассчитайте размер так, чтобы ширина помещалась в поле. Затем проверьте, больше ли вычисленная высота над полем, в этом случае вы рассчитываете размер, чтобы высота вписывалась в поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...