Нужна облегченная библиотека / код, который создаст миниатюры и будет оптимальным для использования с ASP.NET MVC - PullRequest
3 голосов
/ 28 октября 2011

Ниже приведен метод действия, который возвращает изображения из базы данных в том виде, в каком они есть, мне нужна некоторая библиотека lite или я сам напишу код, если короткий, который изменит размеры и сожмет эти изображения в соответствии с моими требованиями "Сделать миниатюры", прежде чем они будут переданыответ HTTP.

РЕДАКТИРОВАНИЕ: На самом деле, если подумать, возможно, было бы лучше сохранить миниатюры в дополнительном столбце, так что теперь мне нужен способ сжатия и изменения размера изображений перед их сохранением вбаза данных долго с сохранением копии, которая остается нетронутой.Первоначально сохраняйте изображения, передавая их в HttpPostedFileBase, и теперь вам нужен инструмент, который изменяет размеры и сжимает их перед сохранением в базу данных.

public FileContentResult GetImage(int LineID)
{
    var PMedia = repository.ProductMedias.FirstOrDefault(x => x.LineID == LineID);

    if (PMedia != null)
    {
        return File(PMedia.ImageData, PMedia.ImageMimeType, PMedia.FileName);
    }
    else
    {
        return null;
    }
} 

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

Не изобретай велосипед! Существует очень хорошая, бесплатная (на самом деле с открытым исходным кодом) чистая библиотека .NET, которую можно использовать с API или обработчиком:

http://imageresizing.net/

Поддерживает очень высокое качество изменения размера, конвертирование в несколько форматов, автообрезку, вращение, нанесение водяных знаков ...

И если вы думаете: «Нет, я могу сделать это сам!», Вот 20 причин, почему вы не должны:

http://nathanaeljones.com/163/20-image-resizing-pitfalls/

2 голосов
/ 28 октября 2011

System.Drawing можно использовать для простого создания миниатюр.Тем не менее, его использование не поддерживается для ASP.NET для по ряду веских причин .

Однако, однако, если вы приняли предложение Erik Philips 'и предварительно сгенерировали все эскизы и сохранилиих в базе данных вместе с оригиналами, возможно, будет какой-то процесс (например, служба Windows), который будет периодически генерировать большие пальцы для строк, которые в них нуждаются.Поскольку этот процесс будет генерировать большие пальцы последовательно, у вас не будет проблем с использованием System.Drawing, как в приложении ASP.NET (где вы можете легко получить несколько потоков, сожирающих относительно скудные системные ресурсы, которые System.Drawing упаковывает).

Редактировать: Я только что заметил теги MVC.Я не знаю, может ли System.Drawing использоваться с MVC, или он был заменен чем-то другим.Как правило, .NET всегда имел встроенные полезные графические библиотеки, которые могут легко выполнять самые простые вещи (я не скажу, что он делает простые вещи просто , о чем свидетельствуют 30 перегрузок метода Graphics.DrawImage(...)), так что я ожидаю, что вы все еще можете сделать это в MVC.

2 голосов
/ 28 октября 2011

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

1 голос
/ 28 октября 2011

Вот процедура, которую я использую для создания миниатюр:

    public void MakeThumbnail(string imagePath)
    {
        // Image exists?
        if (string.IsNullOrEmpty(imagePath)) throw new FileNotFoundException("Image does not exist at " + imagePath);

        // Default values
        string Filename = imagePath.ToLower().Replace(".jpg", "_thumb.jpg");
        int Width = 100; // 180;
        int Height = 75; // 135;
        bool lSaved = false;

        // Load image
        Bitmap bitmap = new Bitmap(imagePath);

        // If image is smaller than just save
        try
        {
            if (bitmap.Width <= Width && bitmap.Height <= Height)
            {
                bitmap.Save(Filename, ImageFormat.Jpeg);
                lSaved = true;
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        finally
        {
            bitmap.Dispose();
        }

        if (!lSaved)
        {
            Bitmap FinalBitmap = null;
            // Making Thumb
            try
            {
                bitmap = new Bitmap(imagePath);

                int BitmapNewWidth;
                decimal Ratio;
                int BitmapNewHeight;

                // Change size of image
                Ratio = (decimal)Width / Height;
                BitmapNewWidth = Width;
                BitmapNewHeight = Height;

                // Image processing
                FinalBitmap = new Bitmap(BitmapNewWidth, BitmapNewHeight);
                Graphics graphics = Graphics.FromImage(FinalBitmap);
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.FillRectangle(Brushes.White, 0, 0, BitmapNewWidth, BitmapNewHeight);
                graphics.DrawImage(bitmap, 0, 0, BitmapNewWidth, BitmapNewHeight);

                // Save modified image
                FinalBitmap.Save(Filename, ImageFormat.Jpeg);

            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                if (FinalBitmap != null) FinalBitmap.Dispose();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...