C# 3.0 .NET各向同性图像绘制

C# 3.0 .NET各向同性图像绘制,c#-3.0,C# 3.0,有人知道如何各向同性地调整图像大小吗?这意味着我给了它一个设定的宽度/高度,并且图像被缩放以适应该框中相同的比例,即使它周围有空白?是的。首先计算尺寸,使宽度适合盒子。然后检查计算的高度是否大于框,在这种情况下,您可以计算尺寸,使高度适合框。找到它: public Image ResizeIsotropic(Image src, Size sz) { double d1 = sz.Width / (double)sz.Height; double

有人知道如何各向同性地调整图像大小吗?这意味着我给了它一个设定的宽度/高度,并且图像被缩放以适应该框中相同的比例,即使它周围有空白?

是的。首先计算尺寸,使宽度适合盒子。然后检查计算的高度是否大于框,在这种情况下,您可以计算尺寸,使高度适合框。

找到它:

    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函数是我所拥有的库的其他部分,它们的功能与您所认为的完全相同

结果如下:


虽然我相信约翰·博克的答案是足够的,但这可能是一种更简洁的方法:

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");

是的,我知道怎么做:)。。。找到代码…知道我从哪里得到ImageCodecInfo吗?是的,我也写了,我会发布的。第一幅是原图,第二幅是原图,大小调整为300x300Htrnm。。。所以我只想为其中的两个做一些调整大小的方法?你说它们完全按照它们听起来的样子做-我不知道你的意思是什么…ResizeByHeight调整图像的大小,并将高度设置为传入的值,ResizeByWidth做相同的调整,但宽度不同。基本上,它首先调整大小以适应该区域,然后将其绘制到偏移了额外距离一半的区域。