【问题标题】:Best way to resize server side image resizing in asp.net using c#使用 c# 在 asp.net 中调整服务器端图像大小的最佳方法#
【发布时间】:2013-12-19 19:55:13
【问题描述】:

我正在使用ImageHandler.ashx 调整网站上的图像大小,它会即时调整图像大小。但质量下降。

如何改进此代码以提高图像质量。带有此代码的图像略微像素化。

我使用以下代码行显示图像

imgBanner.ImageUrl = "../ImageHandler.ashx?h=108&w=162&file=../images/ImageName.jpg

以下是处理程序的代码

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

using System;
using System.Web;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

public class ImageHandler : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        // for new height of image
        int h = int.Parse(context.Request.QueryString["h"].ToString());
        // for new width of image
        int w = int.Parse(context.Request.QueryString["w"].ToString());
        // for  image file name
        string file = context.Request.QueryString["file"].ToString();

        // Path of image folder where images files are placed
        string filePath = context.Server.MapPath("~/images/" + file);

        // Resize proccess
        using (System.Drawing.Image img = System.Drawing.Image.FromFile(filePath))
        {
            Bitmap objBmp = new Bitmap(img, w, h);
            string extension = Path.GetExtension(filePath);
            MemoryStream ms;
            byte[] bmpBytes;
            switch (extension.ToLower())
            {
                case ".jpg":
                case ".jpeg":
                    ms = new MemoryStream();
                    objBmp.Save(ms, ImageFormat.Jpeg);
                    bmpBytes = ms.GetBuffer();
                    context.Response.ContentType = "image/jpeg";
                    context.Response.BinaryWrite(bmpBytes);
                    objBmp.Dispose();
                    ms.Close();
                    context.Response.End();
                    break;
                case ".png":
                    ms = new MemoryStream();
                    objBmp.Save(ms, ImageFormat.Png);
                    bmpBytes = ms.GetBuffer();
                    context.Response.ContentType = "image/png";
                    context.Response.BinaryWrite(bmpBytes);
                    objBmp.Dispose();
                    ms.Close();
                    context.Response.End();
                    break;
                case ".gif":
                    ms = new MemoryStream();
                    objBmp.Save(ms, ImageFormat.Gif);
                    bmpBytes = ms.GetBuffer();
                    context.Response.ContentType = "image/png";
                    context.Response.BinaryWrite(bmpBytes);
                    objBmp.Dispose();
                    ms.Close();
                    context.Response.End();
                    break;

            }
            img.Dispose();
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

【问题讨论】:

标签: c# asp.net image-resizing


【解决方案1】:

他们是否有可能改进此代码...但增加质量价值..

尽量保持原始图像的纵横比。调整大小后的图像应适合指定的宽度和高度,但也要保持纵横比。

您也可以尝试使用不同的 InterpolationMode 值。

我的图像大小调整处理程序通常包含此代码的变体:

protected Image Resize(Image img, int resizedW, int resizedH)
{
    Bitmap bmp = new Bitmap(resizedW, resizedH);
    Graphics graphic = Graphics.FromImage((Image)bmp);
    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graphic.DrawImage(img, 0, 0, resizedW, resizedH);
    graphic.Dispose();
    return (Image)bmp;
}

根据评论编辑:
几乎与您的代码相同:

    Image pic = Resize(img, w, h);
    MemoryStream ms = new MemoryStream(); // better use a using statement
    pic.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
   // continue with your code to write to the output stream

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 2019-11-13
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多