ASP.NET是上传后处理缩略图图像的最佳方式

时间:2011-11-04 15:30:58

标签: c# asp.net resize httphandler

我已经阅读过有关创建HttpHandler的信息,每当我想要显示缩略图时,我都会调用它来为我调整大小。 我也听说过其他一些解决方案,但我想知道哪个解决方案最适合社交网站,每个页面和所有地方都会显示缩略图。

在上传origianl文件后调整大小并将图像保存在磁盘上会不会很好?参考这些图像的最佳方法是什么?

有人对我有任何建议吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

  

在调整之后调整大小并将图像保存在磁盘上是否合适?   origianl文件已经上传?什么是最好的参考方式   这些图片?

当然,这就是Twitter所做的,例如,大多数网站都需要显示缩略图。这很费时间。每次对每张图像执行此操作时,您不希望用户闲置。

将缩略图存储在磁盘上并保留对数据库缩略图的引用。或者将它们存储在数据库本身上。我不想进入有关磁盘与数据库的辩论,但每次都不要调整它们的大小。它应该在ONCE完成。

答案 1 :(得分:1)

如果需要,可以使用一些调整大小代码,首先设置一个最大高度和宽度,然后创建一个缩略图,其缩写与原始版本相同,现在违反最大值。

第二,如果您知道最终图像的实际大小并且不需要担心宽高比,则更简单。

    public Image Thumbnail(Image FullsizeImage, int MaxHeight, int MaxWidth)
    {

        try
        {
            // This has to be here or for some reason this resize code will
            // resize an internal Thumbnail and wil stretch it instead of shrinking
            // the fullsized image and give horrible results
            FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
            FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);


            System.Drawing.Image NewImage;


            if (!((MaxWidth < FullsizeImage.Width) || (MaxHeight < FullsizeImage.Height)))
                NewImage = FullsizeImage;
            else
            {
                float HeightRatio = 1;
                float WidthRatio = 1;
                HeightRatio = (float)FullsizeImage.Width / FullsizeImage.Height;
                WidthRatio = (float)FullsizeImage.Height / FullsizeImage.Width;


                float DrawHeight = (float)FullsizeImage.Height;
                float DrawWidth = (float)FullsizeImage.Width;

                if (MaxHeight < FullsizeImage.Height)
                {
                    DrawHeight = (float)MaxHeight;
                    DrawWidth = MaxHeight * HeightRatio;
                }
                if (MaxWidth < DrawWidth)
                {
                    DrawWidth = MaxWidth;
                    DrawHeight = DrawWidth * WidthRatio;
                }

                NewImage = FullsizeImage.GetThumbnailImage((int)(DrawWidth),
                       (int)(DrawHeight), null, IntPtr.Zero);
            }

            return NewImage;

            // To return a byte array for saving in a db 
            //ms = new MemoryStream();

            //NewImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

            //NewImage.Dispose();
            //FullsizeImage.Dispose();

            //return ms.ToArray();
        }
        catch
        {
            return null;
        }
        finally
        {

        }
    }

    public Image Resize(Image OrigImage, int NewHeight, int NewWidth)
    {
        if (OrigImage != null)
        {                
            Bitmap bmp = new Bitmap(OrigImage, new Size(NewWidth, NewHeight));
            bmp.SetResolution(this.ImageResolution, this.ImageResolution);
            Graphics g = Graphics.FromImage(bmp);
            return bmp;
        }
        else
        {
            return null;
        }
    }