C#, asp net.ajax разработка web-приложений, Javascript CSS
 
Задать вопрос asp.net ajax C#

Рубрики


Статьи


Подписка


Подписаться по RSS

Архив

 Полный архив по категориям

Популярные записи


Мои рекомендации



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

К сожалению метод GetThumbnailImage класса image даёт ужасные результаты за счёт фиксированного максиматьного размера(по наблюдениям картинка сжимается до определённого размера а потом растягивается до требуемого), поэтому был использован несколько иной способ сжатия картинки. Кстати он хорош для того, что бы увеличить картинку.

В итоге получился такой вот класс на C#, который загружает и уменьшает картинку.

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Web;
using System.Web.UI.WebControls;
using Image=System.Drawing.Image;

public class ImagesHelper
{
    // Имя файла оригинальной фотографии
    private string fileName;
    // имя файла уменьшеной фотографи, если фото не уменьшалось, то null 
    private string newFileName = null;

    private int width = 0;
    private int height = 0;
    private string folderUrl;


    public ImagesHelper(string folderUrl)
    {
        this.folderUrl = folderUrl;
    }

    /// <summary>
    /// URL папки с картинками
    /// </summary>
    private string FolderUrl
    {
        get { return folderUrl; }
    }

    /// <summary>
    ///  путь к папке с картинками
    /// </summary>
    private string FolderPath
    {
        get { return HttpContext.Current.Server.MapPath(FolderUrl); }
    }


    public string HtmlTag
    {
        get
        {
            if (newFileName == null)
            {
                // если фотография не уменьшалась то просто картинка
                return
                    string.Format("<img src='{0}' border=0 width={1} height={2}/>", 
FolderUrl + fileName, width, height);
            }
            else
            {
                // инче это ссылка
                return string.Format(
"<a href='{3}' target='_blank'><img src='{0}' border=0 width={1} height={2}/></a>",
FolderUrl + newFileName, width, height, FolderUrl + fileName);
            }
        }
    }


    /// <summary>
    /// Загрузить и если необходио уменьшить картинку
    /// </summary>
    /// <param name="fileUpload">Загружаемый файл</param>
    public void UploadImage(FileUpload fileUpload)
    {
        // получаем расширение (не самым красивым способом :)
        string fileExt = 
          fileUpload.FileName.Split('.')[fileUpload.FileName.Split('.').Length - 1];
        // генерируем уникальное имя
        fileName = Guid.NewGuid() + "." + fileExt;
        // сохраняем картинку
        fileUpload.SaveAs(FolderPath + fileName);

        // открываем фотографию
        Image g = Image.FromFile(FolderPath + fileName);
        // запоминаем размеры
        width = g.Width;
        height = g.Height;
        // проверяем её ширину
        if (g.Width > Config.Current.Blog_MaxUserImageWidth)
        {
            // если она больше максимально допустимой то пропорционально пережимаем её
            // новое имя
            newFileName = Guid.NewGuid() + ".jpg";
            // вычисляем новые размеры
            width = Config.Current.Blog_MaxUserImageWidth;
            // пропорциональная высота
            height = g.Height*width/g.Width;
            // немного колдовства :) 
            Bitmap imgOutput = new Bitmap(width, height);
            imgOutput.MakeTransparent(Color.Black);
            Graphics newGraphics = Graphics.FromImage(imgOutput);
            newGraphics.Clear(Color.FromArgb(0, 255, 255, 255));
            newGraphics.CompositingQuality = CompositingQuality.HighQuality;
            newGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            newGraphics.DrawImage(g, 0, 0, width, height);
            newGraphics.Flush();
            // и сохраняем картинку
            imgOutput.Save(FolderPath + newFileName, ImageFormat.Jpeg);
            // освобождаем ресурсы
            newGraphics.Dispose();
            g.Dispose();
            imgOutput.Dispose();
        }
    }
}
Comments are closed.