调整ASP.NET项目中用户上载的图像的大小 - 库?

时间:2009-07-06 07:51:05

标签: asp.net image resize

在一个相当简单的ASP.NET应用程序中,用户可以上传图像,主要来自他的数码相机。我必须将其大小调整为适合Web和缩略图的大小。 这里最好的做法是什么?是否有一个我可以在不在Web服务器上安装东西的情况下实现的库。

5 个答案:

答案 0 :(得分:1)

SO上的这个主题可能会帮助你做出决定:

What is the best image manipulation library

答案 1 :(得分:1)

免责声明:我是这个图书馆的作者。

然而,它专为此目的而设计,并且非常成熟且经过充分测试。

http://nathanaeljones.com/products/asp-net-image-resizer/

我认为您会发现所包含的示例应用程序完全符合您的需求。

答案 2 :(得分:0)

查看BitMap class - 您可以通过在构造函数中指定大小来轻松完成此操作。

所以想象你想要减半:

Bitmap firstBitMap; // created somewhere else

// Create a new bitmap from the first, scaling down as we go
Bitmap halfSize = new Bitmap(firstBitMap, new Size(firstBitMap.Width/2, firstBitMap.Height/2));

如果您需要更高质量的解决方案,则需要consider the InterpolationMode enumeration

对于您描述的简单场景,您当然不需要打扰第三方库。

答案 3 :(得分:0)

我不是图像专家,但我在网站上实现了图像大小调整并使用了类似的东西:

public static void ResizeImageHighQuality(string imgFilename, string imgResizedFilename, int resizeH, int resizeW)
{
    Image img = Image.FromFile(imgFilename);
    int h = 0, w = 0;

    if (img.Width > img.Height)
    {
        w = Convert.ToInt32(resizeW);
        h = Convert.ToInt32(w * Convert.ToDouble(img.Height) / Convert.ToDouble(img.Width));

    }
    else if (img.Height > img.Width)
    {
        h = Convert.ToInt32(resizeH);
        w = Convert.ToInt32(h * Convert.ToDouble(img.Width) / Convert.ToDouble(img.Height));
    }
    else
    {
        h = resizeH;
        w = resizeW;
    }

    Image thumbnail = new Bitmap(w, h);
    Graphics graphic = Graphics.FromImage(thumbnail);

    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graphic.SmoothingMode = SmoothingMode.HighQuality;
    graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
    graphic.CompositingQuality = CompositingQuality.HighQuality;

    graphic.DrawImage(img, 0, 0, w, h);

    ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders();
    EncoderParameters Params = new EncoderParameters(1);
    Params.Param[0] = new EncoderParameter(Encoder.Quality, 100L);

    File.Delete(imgResizedFilename);
    FileStream fs = new FileStream(imgResizedFilename, FileMode.CreateNew);
    thumbnail.Save(fs, Info[1], Params);
    fs.Close();
}

答案 4 :(得分:0)

使用Bitmap(和任何其他System.Drawing类)是specifically prohibited in ASP.NET(请参阅文档页面顶部附近的警告)。

使用它们可能会导致以下异常:

TypeInitializationException: The type initializer for 'System.Windows.Media.Brush' threw an exception.
   at System.Windows.Media.SolidColorBrush..ctor(Color color)
   ...
'System.Windows.Media.Transform' threw an exception.
   at System.Windows.Media.Brush..cctor()Win32Exception: The operation completed successfully
   at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
   at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   at MS.Win32.MessageOnlyHwndWrapper..ctor()
   at System.Windows.Threading.Dispatcher..ctor()
   at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
   at System.Windows.Freezable..ctor()
   at System.Windows.Media.MatrixTransform..ctor(Matrix matrix)
   at System.Windows.Media.Transform..cctor()

Win32Exception: The operation completed successfully
   at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   at System.Windows.Media.MediaContextNotificationWindow..ctor(MediaContext ownerMediaContext)
   at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)

根据您的目的,Windows Imaging Component可能会满足您的需求。通过创建单个STA线程并调用所有绘图操作,我们也获得了好运。