【问题标题】:How do I resize an image to fill the new dimensions?如何调整图像大小以填充新尺寸?
【发布时间】:2020-12-18 06:51:16
【问题描述】:

我正在尝试拉伸图像以适应新尺寸,但我无法弄清楚如何使图像填充新尺寸,它只会创建更大的图像尺寸但它会保持图像不变,我希望图像填充指定的宽度和高度。

 private Bitmap resizeImage(Image image, int width, int height, float HorizontalResolution, float VerticalResolution)
        {

            Rectangle destRect = new Rectangle(0, 0, width, height);

            Bitmap destImage = new Bitmap(width, height);

            destImage.SetResolution(HorizontalResolution, VerticalResolution);

            using (var graphics = Graphics.FromImage(destImage))
            {
                graphics.CompositingMode = CompositingMode.SourceCopy;
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = SmoothingMode.HighQuality;
                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

                using (var wrapMode = new ImageAttributes())
                {
                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
                    graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
                }
            }

            return destImage;
        }

【问题讨论】:

  • 什么是image.Widthimage.Heightwidthheight?你能展示你实际得到的结果吗?
  • 这能回答你的问题吗? Image resizing using C#
  • @BenVoigt image.Widthimage.Height 是原始图像尺寸,widthheight 是新尺寸。如果您尝试在任何图像上运行这段代码,然后在paint 中打开图像,您会看到尺寸是正确的,但图像并没有填满画布中的所有尺寸,它似乎只会在某些时候增长水平。
  • 它们代表什么已经很清楚了,但它们的实际(数字)值是多少?
  • @OlivierRogier 我查看了提供的链接中给出的已接受答案,结果相同,完全没有区别。

标签: c# image


【解决方案1】:

由于您想将整个源图像拉伸到指定大小,只需使用不接受源坐标的简单五参数重载即可:

像这样:

graphics.DrawImage(image, 0, 0, width, height);

【讨论】:

  • 不确定您是否使用某些图像进行了测试,但我按照指示进行了操作并保持不变,我删除了wrapMode 块。发生的情况是:图像是使用指定的宽度和高度创建的,但由于某种原因它没有填满整个尺寸,它似乎与宽度和高度成正比,但我需要在没有背景的情况下适应整个空间。
  • @Felipe:您是说它在保持纵横比的情况下进行缩放,并且您希望它拉伸到新的纵横比? (我很确定这个函数调用确实会在不保留纵横比的情况下执行拉伸)
  • @Felipe:您是否要删除原始图像中存在的空白空间?
  • 也许你是对的,我会尝试从原始图像中删除空白。
  • @Filipe:如果image.Widthimage.Height 内部有空白,则它与图片的其余部分没有任何不同。在我建议的DrawImage 调用中,它无法知道您要丢弃空白区域,而在您的问题中,您具体告诉它要拉伸源图像的哪个矩形并包括空白区域在你给它的矩形中。您必须给它一个矩形来定义图像的“重要”部分......然后该部分将填充目标区域。
【解决方案2】:

尽管没有一个答案对我有用,但我感谢所有帮助和建议,我可以很快找到解决方案,以下是对我有用的代码:

private Bitmap resizeImage(Image image, int width, int height, float HorizontalResolution, float VerticalResolution)
{
    Rectangle destRect = new Rectangle(0, 0, width, height);
    Bitmap destImage = new Bitmap(width, height);

    destImage.SetResolution(HorizontalResolution, VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
         graphics.CompositingQuality = CompositingQuality.HighQuality;
         graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
         graphics.SmoothingMode = SmoothingMode.HighQuality;
         graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;


         //drawImage must be set this way to get the desired outcome
         graphics.DrawImage(imageBox.Image, new Rectangle(0, 0, image.Width, image.Height), destRect, GraphicsUnit.Pixel);
    }

    return destImage;
}

基本上我删除了wrapMode 代码并更改了我的drawImage 方法。

【讨论】:

    【解决方案3】:

    您需要使用较新的widthheight 绘制图像。它看起来像这样:

      graphics.DrawImage(image, destRect, 0, 0, destRect.Width, destRect.Height, GraphicsUnit.Pixel, wrapMode);
    

    【讨论】:

    • 我进行了更改,而不是让我的图像拉伸,而是在画布的每个角落制作了 4 个副本/复制一个。
    • @Felipe:你认为TileFlipXY 是什么意思?
    • @BenVoigt 是的,我尝试不使用 wrapMode ,没有副本/重复,但图像继续无法拉伸以适应尺寸。
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 2012-12-16
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2015-07-08
    相关资源
    最近更新 更多