C# 将图像缩放到1600x700像素

C# 将图像缩放到1600x700像素,c#,image,C#,Image,当用户上传任何图像时,我们可以将其缩放到1600 X 700吗 我正在使用下面的代码来缩放1996 X 1442的图像,但它从未缩放到1600 X 700 有没有更好的方法或其他方法来实现它 private static Image resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; int sourceHeight = i

当用户上传任何图像时,我们可以将其缩放到1600 X 700吗

我正在使用下面的代码来缩放1996 X 1442的图像,但它从未缩放到1600 X 700

有没有更好的方法或其他方法来实现它

private static Image resizeImage(Image imgToResize, Size size)
        {
            int sourceWidth = imgToResize.Width;
            int sourceHeight = imgToResize.Height;

            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;

            nPercentW = ((float)size.Width / (float)sourceWidth);
            nPercentH = ((float)size.Height / (float)sourceHeight);

            if (nPercentH < nPercentW)
                nPercent = nPercentH;
            else
                nPercent = nPercentW;

            int destWidth = (int)(sourceWidth * nPercent);
            int destHeight = (int)(sourceHeight * nPercent);

            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();

            return (Image)b;
        }
private static Image resizeImage(图像imgToResize,大小)
{
int sourceWidth=imgToResize.Width;
int sourceHeight=imgToResize.Height;
浮动百分比=0;
浮动nPercentW=0;
浮点数nPercentH=0;
nPercentW=((float)size.Width/(float)sourceWidth);
nPercentH=((浮点)size.Height/(浮点)sourceHeight);
如果(nPercentH
如果你查看下面的评论,他们说如果不降低纵横比就无法存档,但是如果我看到
airbnb
中的英雄图像,他们的图像是1600 X 700


因此,我认为这在某种程度上是可能的,但我不知道如何实现…

当然不是,因为1600 x 700的纵横比(0.4375)与1996 x 1442(0.7724)不同。你这样做的方式是保持纵横比的比例,所以从1996年到1442年,你永远不会达到1600 x 700

你可以:

  • 缩放图像,使较长的角点为1600长,然后剪切出尺寸为1600 x 700的相关部分(保持纵横比)
  • 将图像缩放到1600 x 700,可能会因为垂直“挤压”而扭曲图像
  • 代码中的另一个问题是舍入问题

    int destWidth = (int)...;
    int destHeight = (int)...;
    
    简单地删去小数点。即使计算结果为699.9,
    destWidth
    也将为699


    您可能想改用
    Math.Round
    ,这会像预期的那样将699.9到700进行取整。

    我在几个方面调整了您的方法:

  • 它现在根据更大的比例进行缩放,而不是更小的比例,因此您最终会从图像中删除一些内容,而不是留下白色(?)字母框。(这只是
    ,但很容易更改。)
  • 对于应该相等的那一面,这确保了它是相等的,而不是缩放和舍入,希望你不会得到一个像素差
  • 如果纵横比不匹配,它会将绘制的图像居中于
    g
    上,因此您最终会得到等量的左右或顶部和底部修剪。(在不知道原始图像的比例是否正确的情况下,您必须以某种方式决定要修剪图像的哪些位。)
  • 试一试,看看你是否喜欢结果

    private static Image resizeImage(Image imgToResize, Size size)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;
    
        double wRatio = (double)size.Width / sourceWidth;
        double hRatio = (double)size.Height / sourceHeight;
    
        int destWidth, destHeight;
        float top, left;
    
        if (wRatio > hRatio) // reverse for white bars rather than trimming
        {
            destWidth = size.Width;
            destHeight = (int)Math.Ceiling(sourceHeight * wRatio);
            left = 0;
            top = (destHeight - size.Height) / 2f;
        }
        else
        {
            destHeight = size.Height;
            destWidth = (int)Math.Ceiling(sourceWidth * hRatio);
            top = 0;
            left = (destWidth - size.Width) / 2f;
        }
    
        Bitmap b = new Bitmap(size.Width, size.Height);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
        g.DrawImage(imgToResize, left, top, destWidth, destHeight);
        g.Dispose();
    
        return (Image)b;
    }
    
    此代码保留了原始图像的外观。如果保留它并不重要,那么您可以去掉比率计算部分,创建一个直接提供大小的位图对象

    private static Image resizeImage(Image imgToResize, Size size)
    {
        Bitmap b = new Bitmap(size.Width, size.Height);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();
    
        return (Image)b;
    }
    

    嗯,事实上是的!这个世界上几乎没有什么不可能的事。只需尝试搜索有关“”的信息。很抱歉,这里没有代码,因为我对这些算法不太熟悉。

    您会遇到什么错误,或者操作的结果是什么?您需要调整图像的大小,因为纵横比不同。请检查此。尺寸=新尺寸(10000700);var测试=大小图像(演示,大小);给我一张989*699的图像舍入问题是问题的一部分-基本上,在计算
    destWidth
    destWidth
    时,您正在删除小数点。如果您使用
    Math.Round
    并始终使用“up”进行取整,您可能会得到您所期望的结果。我查看了airbnb网站。令我惊讶的是,他们有分辨率为1600*700的图像。知道他们是如何做到的吗。。。。这就是我所期待的。。1) 我不想失去纵横比2)我希望图像是1600*700。。从评论来看,我觉得这是不可能的。但如果我看到像airbnb这样的网站,他们正在实现这一目标。他们的英雄形象大小都是1600*700。好吧,也许他们只是删掉了形象的相关部分?你能给我一个片段吗?我不想让形象失真…:(它做得很好,但不是确切的东西……它给了我适当的宽度,即1600,但没有给我适当的高度700。我想你可以再调整一下……谢谢你的帮助和支持。@user1921045啊,是的,一秒钟……应该可以it@user1921045,这就是我写的,如果保留纵横比并不重要,你可以使用它s代码。我只是想帮忙。