C # Crop, затем масштабируйте обрезанное изображение - PullRequest
3 голосов
/ 17 июня 2011

Я пытаюсь создать этот класс (для использования на сайте ASP.NET), который будет обрезать изображение с заданными значениями ширины, высоты X, Y, а затем взять полученное изображение и масштабировать его до значений ширины, высоты и сохранения вкаталог на сервере возвращает URL этого изображения.

И я получу эти параметры в строке запроса, как это

Default.aspx?x=100&y=300&w=800&h=500&scalew=160&scaleh=100 

Так вот, что я получил до сих пор

    public static Image CustomCrop(int width, int height, int x, int y, int scalwidth, int scalheight)
    {
        try
        {
            Image image = Image.FromFile("Images/none.jpg");
            Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
            bmp.SetResolution(80, 60);

            Graphics gfx = Graphics.FromImage(bmp);
            gfx.SmoothingMode = SmoothingMode.AntiAlias;
            gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gfx.DrawImage(image, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel);


            return bmp;
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
            return null;
        }
    }

Я отправлю эти значения Обрезать изображение (ширина, высота, x, y), затем Масштабировать Обрезанное изображение (масштабирование, высота по высоте), затем сохранить jpg в каталоге и вернуть URL-адрес для местоположения изображения

Так что же такоелучший способ для этого?

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Создайте Generic Handler (т.е. файл ashx) на своем веб-сайте asp.net или в приложении и поместите в него следующий код. Назовите его, например, «Handler.ashx».

Теперь в браузере используйте: Handler.ashx?x=100&y=300&w=800&h=500&scalew=160&scaleh=100

Код Handler.ashx Файл:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public class Handler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/jpeg";
        int x = int.Parse(context.Request["x"]);
        int y = int.Parse(context.Request["y"]);
        int h = int.Parse(context.Request["h"]);
        int w = int.Parse(context.Request["w"]);
        int scalew = int.Parse(context.Request["scalew"]);
        int scaleh = int.Parse(context.Request["scaleh"]);
        using (Image img = CustomCrop(w, h, x, y, scalew, scaleh))
            img.Save(context.Response.OutputStream,ImageFormat.Jpeg); 
    }

    public static Image CustomCrop(int width, int height, int x, int y, int scalwidth, int scalheight)
    {
        try
        {
            Image image = Image.FromFile("c:\\x.jpg");
            Bitmap bmp = new Bitmap(scalwidth, scalheight, PixelFormat.Format24bppRgb);
            bmp.SetResolution(80, 60);

            Graphics gfx = Graphics.FromImage(bmp);
            gfx.SmoothingMode = SmoothingMode.AntiAlias;
            gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
            gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;
            gfx.DrawImage(image, new Rectangle(0, 0, scalwidth, scalheight), x, y, width, height, GraphicsUnit.Pixel);


            return bmp;
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
            return null;
        }
    }
    public bool IsReusable {
        get {
            return false;
        }
    }

}

EDIT:

Некоторые ссылки на универсальные обработчики:

Обзор обработчиков HTTP и модулей HTTP

@ WebHandler - как работают файлы Ashx.

1 голос
/ 02 февраля 2012

A для этого уже существует хорошо проверенная и проверенная библиотека с открытым исходным кодом - imageresizing.net , которая поддерживает как GDI +, WIC, так и FreeImage backends.Я написал его в 2009 году и с тех пор выпустил 60 новых версий.Он используется на более чем 10 000 веб-сайтов и поддерживает некоторые чрезвычайно крупные сайты социальных сетей.

System.Drawing почти невозможно использовать правильно. Я задокументировал около 30 ловушек , и скоро появятся другие.Это можно сделать безопасно, но вы не собираетесь делать это путем копирования и вставки кода.

Лучше использовать оболочку, чем обрабатывать управление памятью для вас из конца в конец и избегать всегоподводные камни GDI + и ASP.NET.

1 голос
/ 17 июня 2011

Ну, у вас уже есть рабочий код, который действительно является одним из способов - возможно, вы можете добавить сжатие (например, формат JPEG будет использовать сжатие с потерями) - см. Эту статью: http://www.britishdeveloper.co.uk/2011/05/image-resizing-cropping-and-compression.html

Однако, Я рекомендую не использовать System.Drawing namespace .Согласно документации MSDN , использование GDI + (это System.Drawing) в приложениях ASP.NET не поддерживается.Скорее, он рекомендует Windows Imaging Components (т.е. использует WPF Imaging с точки зрения .NET - он использует WIC для внутреннего использования).В этой статье вы узнаете, как использовать WPF для обрезки / масштабирования изображений: http://weblogs.asp.net/bleroy/archive/2009/12/10/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...