C# 使用GDI+调整图像大小;

C# 使用GDI+调整图像大小;,c#,gdi+,C#,Gdi+,我真的在努力从这段代码中获得更多的性能。它不是一个被大量使用的代码,但是每次上传一个新图像时都会用到它,每个图像会用到4次(100px,200px,500px,700px)。因此,当有2到3个以上的图像处理时,服务器会有点忙。此外,我还试图找出如何使其正确处理低分辨率的图像。目前,它只是在中途将其切掉,而不是将其切掉。 例如: 谢谢你的帮助 首先想到的是,你想过多线程吗?i、 e.为单独线程中的每个图像(或一批图像)调用此方法?这样,如果您的服务器有几个核心,您就可以更快地完成任务。只是一个想法

我真的在努力从这段代码中获得更多的性能。它不是一个被大量使用的代码,但是每次上传一个新图像时都会用到它,每个图像会用到4次(100px,200px,500px,700px)。因此,当有2到3个以上的图像处理时,服务器会有点忙。此外,我还试图找出如何使其正确处理低分辨率的图像。目前,它只是在中途将其切掉,而不是将其切掉。 例如:


谢谢你的帮助

首先想到的是,你想过多线程吗?i、 e.为单独线程中的每个图像(或一批图像)调用此方法?这样,如果您的服务器有几个核心,您就可以更快地完成任务。只是一个想法…

(线程是一个很好的技巧。)

每次尝试使用尽可能最小的图像(而不是原始图像)作为输入调用方法。如果原始图像是,比如说2000px,那么从它创建700px图像,然后使用新创建的700px图像创建500px,等等


对于高质量双三次设置,我怀疑您是否会注意到100px图像中的任何差异。(但这当然需要验证。)

为了完整起见,下面是问题第二部分的解决方案,但从未得到回答。处理低分辨率图像时,图像被切断。现在的解决方案似乎显而易见。问题在于上面的这段代码:

using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, 
                                                    PixelFormat.Format32bppRgb))
问题是我选择的是像素格式,而不是原始图像的格式。正确的代码如下:

public static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
{
    using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
    {
        Size newSize = CalculateDimensions(oldImage.Size, targetSize);

    using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height,  
                                                        oldImage.PixelFormat))
    {
        newImage.SetResolution(oldImage.HorizontalResolution, 
                                                   oldImage.VerticalResolution);
        using (Graphics canvas = Graphics.FromImage(newImage))
        {
            canvas.SmoothingMode = SmoothingMode.AntiAlias;
            canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
            MemoryStream m = new MemoryStream();
            newImage.Save(m, ImageFormat.Jpeg);
            return m.GetBuffer();
        }
    }

   }
}

除了多线程,我还将添加缓存和利用文件系统(而不是数据库)。@Jay Zeng,目前该应用程序正在处理图像,然后再将其插入数据库。一点缓存可能会有很长的路要走,但我必须做更多的测试,以确保它不会影响太多,并进一步限制我的6gb内存。我喜欢线程的想法。我应该能够弹出到一个新的线程,这应该加快网站的整体视图时,一个用户上传了很多文件,其他人试图查看网站的其余部分。今晚我要开始讨论这个问题!现在有没有办法让它更好地用于低分辨率的图像呢?我在第二期中也添加了一个例子。我喜欢这个主意!我也从来没有这样想过,对我来说,这就像是倒行逆施。我通常不会逆向思考(不管我的同事怎么想)。这与线程的结合应该是一个巨大的帮助,因为这样它就不必为每个图像大小重新处理2到4mb的文件。我将测试并发布结果。
public static byte[] ResizeImageFile(byte[] imageFile, int targetSize)
{
    using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile)))
    {
        Size newSize = CalculateDimensions(oldImage.Size, targetSize);

    using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height,  
                                                        oldImage.PixelFormat))
    {
        newImage.SetResolution(oldImage.HorizontalResolution, 
                                                   oldImage.VerticalResolution);
        using (Graphics canvas = Graphics.FromImage(newImage))
        {
            canvas.SmoothingMode = SmoothingMode.AntiAlias;
            canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
            MemoryStream m = new MemoryStream();
            newImage.Save(m, ImageFormat.Jpeg);
            return m.GetBuffer();
        }
    }

   }
}