在 c# 中从内存流另存为 jpeg

本文关键字:另存为 jpeg 内存 | 更新日期: 2023-09-27 18:34:42

我有一个如下所示的方法将图像保存为 jpeg。我想保存所有具有相同高度和宽度的图片而不会失真。

我该怎么做?请帮忙

public void SaveFileOnDisk(MemoryStream ms, string FileName)
{
    try
    {
        string appPath = HttpContext.Current.Request.ApplicationPath;
        string physicalPath = HttpContext.Current.Request.MapPath(appPath);
        string strpath = physicalPath + "''Images";
        string WorkingDirectory = strpath;

        System.Drawing.Image imgSave = System.Drawing.Image.FromStream(ms);
        Bitmap bmSave = new Bitmap(imgSave);
        Bitmap bmTemp = new Bitmap(bmSave);
        Graphics grSave = Graphics.FromImage(bmTemp);
        grSave.DrawImage(imgSave, 0, 0, imgSave.Width, imgSave.Height);
        bmTemp.Save(WorkingDirectory + "''" + FileName + ".jpg");

        imgSave.Dispose();
        bmSave.Dispose();
        bmTemp.Dispose();
        grSave.Dispose();
    }
    catch (Exception ex)
    {
        //lblMsg.Text = "Please try again later.";
    }
}

在 c# 中从内存流另存为 jpeg

调整图像大小并保存

Private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;
    double resizeWidth = srcWidth;
    double resizeHeight = srcHeight;
    double aspect = resizeWidth / resizeHeight;
    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }
    img.Width = resizeWidth;
    img.Height = resizeHeight;
}

您可以使用此代码在保存之前将图像大小调整为所需的尺寸

正如其他人提到的,如果您希望所有图像的大小相同而不会失真,则需要在保持纵横比的同时调整大小。请参阅下面的函数:

public Image ResizeWithSameRatio(Image image, float width, float height)
{
    // the colour for letter boxing, can be a parameter
    var brush = new SolidBrush(Color.Black);
    // target scaling factor
    float scale = Math.Min(width / image.Width, height / image.Height);
    // target image
    var bmp = new Bitmap((int)width, (int)height);
    var graph = Graphics.FromImage(bmp);
    var scaleWidth = (int)(image.Width * scale);
    var scaleHeight = (int)(image.Height * scale);
    // fill the background and then draw the image in the 'centre'
    graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
    graph.DrawImage(image, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight));
    return bmp;
}

现在,您的使用函数可以大大简化(假设此处的目标图像为 1024x768(:

public void SaveFileOnDisk(MemoryStream ms, string FileName)
{
    try
    {
        string appPath = HttpContext.Current.Request.ApplicationPath;
        string physicalPath = HttpContext.Current.Request.MapPath(appPath);
        string strpath = physicalPath + "''Images";
        string WorkingDirectory = strpath;
        using (var original = Image.FromStream(ms))
        using (var resized = ResizeWithSameRatio(original, 1024, 768))
        {
            resized.Save(WorkingDirectory + "''" + FileName + ".jpg");
        }
    }
    catch (Exception ex)
    {
        //lblMsg.Text = "Please try again later.";
    }
}

请注意在变量数量方面增加了简化,并使用 using 而不是 Dispose() 进行处置。