Изменение размера изображения класса


Как это класс для изменения размера изображения?

using System;
using System.Collections.Generic;
using System.Web;
using System.Drawing;
using System.IO;

/*
 * Resizes an image
 **/
public static class ImageResizer
{
    // Saves the image to specific location, save location includes filename
    private static void saveImageToLocation(Image theImage, string saveLocation)
    {
        // Strip the file from the end of the dir
        string saveFolder = Path.GetDirectoryName(saveLocation);
        if (!Directory.Exists(saveFolder))
        {
            Directory.CreateDirectory(saveFolder);
        }
        // Save to disk
        theImage.Save(saveLocation);
    }

    // Resizes the image and saves it to disk.  Save as property is full path including file extension
    public static void resizeImageAndSave(Image ImageToResize, int newWidth, int maxHeight, bool onlyResizeIfWider, string thumbnailSaveAs)
    {
        Image thumbnail = resizeImage(ImageToResize, newWidth, maxHeight, onlyResizeIfWider);
        thumbnail.Save(thumbnailSaveAs);
    }
    // Overload if filepath is passed in
    public static void resizeImageAndSave(string imageLocation, int newWidth, int maxHeight, bool onlyResizeIfWider, string thumbnailSaveAs)
    {
        Image loadedImage = Image.FromFile(imageLocation);
        Image thumbnail = resizeImage(loadedImage, newWidth, maxHeight, onlyResizeIfWider);

        saveImageToLocation(thumbnail, thumbnailSaveAs);
    }

    // Returns the thumbnail image when an image object is passed in
    public static Image resizeImage(Image ImageToResize, int newWidth, int maxHeight, bool onlyResizeIfWider)
    {
        // Prevent using images internal thumbnail
        ImageToResize.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        ImageToResize.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        // Set new width if in bounds
        if (onlyResizeIfWider)
        {
            if (ImageToResize.Width <= newWidth)
            {
                newWidth = ImageToResize.Width;
            }
        }

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

        // Create the new image
        Image resizedImage = ImageToResize.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero);

        // Clear handle to original file so that we can overwrite it if necessary
        ImageToResize.Dispose();


        return resizedImage;
    }
    // Overload if file path is passed in instead
    public static Image resizeImage(string imageLocation, int newWidth, int maxHeight, bool onlyResizeIfWider)
    {
        Image loadedImage = Image.FromFile(imageLocation);
        return resizeImage(loadedImage, newWidth, maxHeight, onlyResizeIfWider);
    }
}


7884
12
задан 2 февраля 2011 в 02:02 Источник Поделиться
Комментарии
3 ответа

PascalCase метод названия и способ параметры, если вы чувствуете себя чрезмерно амбициозны.

    // Set new width if in bounds
if (onlyResizeIfWider)
{
if (ImageToResize.Width <= newWidth)
{
newWidth = ImageToResize.Width;
}
}

FindBugs, не лает в Java для выше поведение... рефакторинг в один, если так как вы ничего не делаете в первом случае в любом случае...

    // Set new width if in bounds
if (onlyResizeIfWider && ImageToResize.Width <= newWidth)
{
newWidth = ImageToResize.Width;
}

Комментарии здесь мог бы быть немного более описательное; в то время как вы заявляете, что в итоге я все равно проиграл, почему, что бы решить этот вопрос.

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

Может, что-то похожее на то, что указано на этом блоге...

    // Prevent using images internal thumbnail since we scale above 200px; flipping
// the image twice we get a new image identical to the original one but without the
// embedded thumbnail
ImageToResize.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
ImageToResize.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

12
ответ дан 2 февраля 2011 в 03:02 Источник Поделиться

Если вы используете C# 3.0, вы можете использовать методы расширения

// declare as
public static Image ResizeImage(this Image source, ...

// use as
Image myThumb = myImage.Resize(...);

Обрабатывать ширину иначе, чем высота кажется несовместимым.

Никогда не размещайте переданные аргументы в общественную функцию (ImageToResize). Абонент почти никогда не ожидает, чтобы это произошло.

Утилизируйте временные локальные переменные (loadedImage). Никакой другой код не может сделать это, и это может привести к утечке памяти.

8
ответ дан 2 февраля 2011 в 07:02 Источник Поделиться

В C# это вообще обычная практика, чтобы использовать Паскаль случае в именах методов (так SaveImageToLocation вместо saveImageToLocation) и Верблюд в случае имена параметров (так, "публичный статический образ ResizeImage(изображения imageToResize, ...")

RotateFlip может быть довольно дорогостоящей операции просто, чтобы очистить внутренний эскиз. Что касается изображения, нужна ли поддержка векторных изображений или это обычно используется для растровых изображений (растровые) изображения (в том числе сжатые вариаций, таких как PNG, JPG, джиф, и т. д.)? Если вы только планируете вывод растровых изображений, то я предлагаю использовать растровые(изображение оригинала, int ширина, int высота) - конструктор, которая займет исходное изображение и масштабировать его, что избавляет от необходимости делать дорогостоящие замены. Существует ряд методов, чтобы привлечь масштабировать изображения, некоторые из которых являются гораздо более эффективными, чем другие, и у каждого есть различные плюсы и минусы их использования, но самое большое преимущество для GetThumbnailImage является использование встроенных эскизов.

Это вообще не хорошая практика, чтобы избавиться от параметра, поэтому он может потребовать другой шаблон (возвращение образа и позволить вызывающему коду изображения вызова.Сохранить(именем), по своему усмотрению, но не это самое страшное), но если вы намерены оставить его таким образом, вы должны обязательно комментировать. См. Этот пост для получения информации о загрузке изображений без блокировки файлов. Перегрузок, которые получают путь к файлу, а не объект изображения должны обернуть свои загруженные файлы изображения в блоке using (или попробовать/наконец+утилизация) примерно так:

public static void ResizeImageAndSave(string imageLocation, int newWidth, int maxHeight, bool onlyResizeIfWider, string thumbnailSaveAs)
{
Image thumbnail = null;

try
{
using (Image loadedImage = Image.FromFile(imageLocation))
{
thumbnail = resizeImage(loadedImage, newWidth, maxHeight, onlyResizeIfWider);
}
saveImageToLocation(thumbnail, thumbnailSaveAs);
}
finally
{
if (thumbnail != null) thumbnail.Dispose();
}
}

Надеюсь, что это помогает :)

5
ответ дан 2 февраля 2011 в 03:02 Источник Поделиться