簡體   English   中英

即時更改圖像質量

[英]Change image quality on the fly

我已經編寫了這段代碼來即時裁剪和調整圖像大小。 我將處理后的圖像發送到瀏覽器,例如<img src="imagehandler.aspx?img=1.jpg">

imagehandler.aspx:

<%@ Page Language="C#"%>
<%@ import Namespace="System.Drawing" %>
<%@ import Namespace="System.IO" %>
<script runat="server">
    System.Drawing.Image oldImage, newImage,cloned,tempImage;
    void Page_Load(Object sender, EventArgs e) {
    string strFileName = Convert.ToString(Request.QueryString["img"]);
    oldImage = System.Drawing.Image.FromFile(Server.MapPath(strFileName));
    rect= new Rectangle(0,50,100,100);  
    cloned = new Bitmap(oldImage ).Clone(rect, tempImage.PixelFormat);
    newImage = new Bitmap(cloned);
    cloned.Dispose();   

    Response.ContentType = "image/jpeg";
    newImage.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
    oldImage.Dispose();
    newImage.Dispose();
    oldImage = null;
    newImage = null;
    }
</script>

現在,我想對輸出圖像添加質量控制,並且找到了此Q / A。這個答案提出了一種將圖像保存到磁盤的方法。 我已嘗試使其適合我的目的。 目前,我只能將其保存在磁盤上,並且該方法無效。 在將結果流式傳輸到瀏覽器之前,我不知道如何將輸出傳遞到我自己的代碼:

private void VaryQualityLevel(bmp1)
{
    ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
    System.Drawing.Imaging.Encoder myEncoder= System.Drawing.Imaging.Encoder.Quality;
    EncoderParameters myEncoderParameters = new EncoderParameters(1);
    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jgpEncoder,myEncoderParameters);
}

private ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    foreach (ImageCodecInfo codec in codecs)
    {
        if (codec.FormatID == format.Guid)
        {
            return codec;
        }
    }
    return null;
}

您可以將位圖直接保存到MemoryStream並使用它進行任何操作。 您的編碼器將應用於此流中的圖像。 不用傳遞文件路徑作為Save方法的第一個參數,只需傳遞MemoryStream的實例即可。 如果我沒記錯的話,還有一種方法可以直接將此流作為對瀏覽器的響應。

using(var ms = new MemoryStream()) 
{
    bmp1.Save(ms, jgpEncoder, myEncoderParameters);
    var bmp2 = new BitMap(ms);
    //do whatever you want with this image
}

記住要使用聲明或處置方法來避免內存泄漏。

此處有更多詳細信息: https : //docs.microsoft.com/zh-cn/dotnet/api/system.drawing.bitmap?view=netframework-4.7.2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM