缩略图和相册

时间:2011-12-28 03:57:19

标签: c# asp.net image-processing

我正在为我的照片组合制作相册。但我在质疑以下内容:

我应该将缩略图版本保存在服务器上的文件系统上,还是应该在请求缩略图时动态生成缩略图?

我认为存储缩略图的优点是服务器上的处理较少,因为它生成文件一次(当文件上传时)。但缺点是如果我有一天决定缩略图的大小不对,我就有问题了。此外,我现在存储2个文件(拇指加原始文件)。

然后,缩略图是否有最佳尺寸?我想答案是 - 你想要存储缩略图的大小。我的问题是,我的thumnails被调整到最大150高或最大150宽。但是,文件的大小仍然达到了大约40k。

我正在使用它:

public void ResizeImage(string originalFile, string newFile, int newWidth, int maxHeight, bool onlyResizeIfWider)
    {
        System.Drawing.Image fullsizeImage = System.Drawing.Image.FromFile(MapPath(GlobalVariables.UploadPath + "/" + originalFile));

        // Prevent using images internal thumbnail
        fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        fullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (onlyResizeIfWider)
        {
            if (fullsizeImage.Width <= newWidth)
            {
                newWidth = fullsizeImage.Width;
            }
        }

        int newHeight = fullsizeImage.Height * newWidth / fullsizeImage.Width;
        if (newHeight > maxHeight)
        {
            // Resize with height instead
            newWidth = fullsizeImage.Width * maxHeight / fullsizeImage.Height;
            newHeight = maxHeight;
        }

        System.Drawing.Image newImage = fullsizeImage.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);

        // Clear handle to original file so that we can overwrite it if necessary
        fullsizeImage.Dispose();
        // Save resized picture
        newImage.Save(MapPath(GlobalVariables.UploadPath + "/" + newFile));
    }

有没有办法减小文件大小,因为150高/ 150宽是非常小的。我想要上升到250左右,但如果我显示12个拇指......需要一段时间才能加载。

1 个答案:

答案 0 :(得分:2)

是绝对必须保存为缩略图文件而不是一直处理。

关于图像,尝试使其绝对适合8x8或16x16数组块,因为这是jpeg用于分割和压缩它的大小。例如,因为150/8 = 18.75,所以不要150x150,使用152x152因为152/8 = 19

然后减少文件大小和改变质量的属性是

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

以下是How to: Use Interpolation Mode to Control Image Quality During Scaling

的示例