C#裁剪然后缩放裁剪图像

时间:2011-06-17 04:23:18

标签: c# asp.net image-processing

我正在尝试构建此类(在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)然后缩放Croped图像(scalwidth,scalheight)然后将jpg保存在目录中并返回图像位置的URL

那么最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

在asp.net网站或应用程序中创建一个Generic Handler(即ashx文件),并将以下代码放入其中。称之为“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;
        }
    }

}

修改

关于通用处理程序的一些参考:

HTTP Handlers and HTTP Modules Overview

@ WebHandler - ashx文件的工作原理。

答案 1 :(得分:1)

嗯,你已经有了工作代码,这确实是其中之一 - 你可以添加压缩(例如,JPEG格式会使用有损压缩) - 请参阅这篇文章:http://www.britishdeveloper.co.uk/2011/05/image-resizing-cropping-and-compression.html

但是,我建议不要使用System.Drawing命名空间。根据{{​​3}},不支持在ASP.NET应用程序中使用GDI +(即System.Drawing)。相反,它推荐Windows Imaging Components(即从.NET角度使用MSDN documentation - 它在内部使用WIC)。请参阅此文章,它将启动您使用WPF裁剪/缩放图像:WPF Imaging

答案 2 :(得分:1)

A well tested and proven open-source library already exists for this - imageresizing.net,支持GDI +,WIC和FreeImage后端。我在2009年写了它,并从那时起发布了60个新版本。它已在超过10,000个网站上使用,并为一些非常大的社交网站提供支持。

System.Drawing 几乎无法正确使用。 I've documented about 30 pitfalls,很快就会有更多内容。它可以安全地完成,但你不会通过复制和粘贴代码来实现它。

最好使用包装器而不是从端到端处理内存管理,并避免所有GDI +和ASP.NET陷阱。