我有一个Web应用程序,用户可以上传图片创建他们的画廊。多年前,当我编写这个应用程序时,我选择了ImageMagick,并使用ImageMagick进行了所有的裁剪和调整大小操作。
现在我正在从头开始重写应用程序,我用本地GDI+操作替换了ImageMagick,但是我越学习关于GDI+的知识,就越担心自己做出了错误的选择。
无论我阅读哪里,都说GDI+是为桌面设计的,不应该在服务器应用程序上使用。我不知道细节,但我猜测这是因为内存消耗的原因,而且我确实可以看到GDI+使用更多的内存来进行相同的操作(裁剪和调整大小)在相同的图像上比ImageMagick(虽然真相是GDI+更快)。
现在我正在从头开始重写应用程序,我用本地GDI+操作替换了ImageMagick,但是我越学习关于GDI+的知识,就越担心自己做出了错误的选择。
无论我阅读哪里,都说GDI+是为桌面设计的,不应该在服务器应用程序上使用。我不知道细节,但我猜测这是因为内存消耗的原因,而且我确实可以看到GDI+使用更多的内存来进行相同的操作(裁剪和调整大小)在相同的图像上比ImageMagick(虽然真相是GDI+更快)。
我认为GDI+、ImageMagick或其他库对于这些基本操作应该是差不多的,我喜欢使用原生的GDI+,相信微软在.NET中提供的东西至少还可以。
什么是正确的方法/工具?
这是我用来裁剪的代码:
internal Image Crop(Image image, Rectangle r)
{
Bitmap bmpCrop;
using (Bitmap bmpImage = new Bitmap(image))
{
bmpCrop = bmpImage.Clone(r, bmpImage.PixelFormat);
bmpImage.Dispose();
}
return (Image)(bmpCrop);
}
这是我用来调整大小的代码:
internal Image ResizeTo(Image sourceImage, int width, int height)
{
System.Drawing.Image newImage = new Bitmap(width, height);
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.AntiAlias;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(sourceImage, new Rectangle(0, 0, width, height));
gr.Dispose();
}
return newImage;
}