ASP.NET лучший способ обработки миниатюр изображений после загрузки - PullRequest
0 голосов
/ 04 ноября 2011

Я читал о создании HttpHandler для вызова каждый раз, когда я хочу показать миниатюру, где он будет выполнять изменение размера для меня.Я также слышал о некоторых других решениях, но мне было интересно, какое решение лучше всего подойдет для сайта социальной сети, где миниатюры отображаются повсюду на каждой странице и везде.

Было бы хорошоизменить размер и сохранить изображение на диске после загрузки файла оригинала?Как лучше всего ссылаться на эти изображения?

У кого-нибудь есть советы для меня?Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Было бы хорошо изменить размер и сохранить изображение на диске после загрузки файла origianl?Как лучше всего ссылаться на эти изображения?

Определенно, это то, что делает, например, Twitter и большинство веб-сайтов, когда необходимо отображать эскизы.Это отнимает много времени.Вы не хотите, чтобы ваш пользователь бездействовал, когда вы делаете это для каждого изображения каждый раз.

Сохраняйте миниатюры на диске и сохраняйте ссылку на миниатюры в базе данных.Или храните их на самой БД.Я не хочу вступать в дискуссию о дисках против БД, но просто не меняю их размер каждый раз.Это должно быть сделано ОДИН РАЗ.

1 голос
/ 04 ноября 2011

Вот некоторый код для изменения размера, если вам это нужно, сначала вы устанавливаете максимальную высоту и ширину, и он создает миниатюру с тем же соотношением сторон, что и у оригинала, который теперь нарушает либо макс., если вы знаете фактический размер конечного изображения и вам не нужно беспокоиться о соотношении сторон, это проще.

    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;
        }
    }
...