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

本文关键字:裁剪 图像 然后 缩放 | 更新日期: 2023-09-27 17:59:38

我正在尝试构建这个类(在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

那么,最好的方法是什么呢?

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

在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处理程序和HTTP模块概述

@WebHandler-ashx文件的工作方式。

好吧,您已经有了工作代码,这确实是一种方法-您可能可以添加压缩(例如,JPEG格式将使用有损压缩)-请参阅本文:http://www.britishdeveloper.co.uk/2011/05/image-resizing-cropping-and-compression.html

但是,我建议不要使用System.Drawing命名空间。根据MSDN文档,在ASP。NET应用程序不受支持。相反,它建议Windows映像组件(即从.NET的角度使用WPF映像-它在内部使用WIC)。请参阅本文,该文章将开始使用WPF裁剪/缩放图像:http://weblogs.asp.net/bleroy/archive/2009/12/10/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi.aspx

一个经过充分测试和验证的开源库已经存在,它支持GDI+、WIC和FreeImage后端。我在2009年写的,从那时起已经发布了60个新版本。它在超过10000个网站上使用,并为一些超大的社交网站提供动力。

系统。绘图几乎不可能正确使用。我已经记录了大约30个陷阱,接下来还会有更多的陷阱。可以安全地完成,但不能通过复制和粘贴代码来完成。

使用包装器比从端到端为您处理内存管理要好,并且避免了所有的GDI+和ASP。NET陷阱。