首页 > 解决方案 > System.Drawing.Imaging.Encoder.Quality 文件大小奇怪地变化

问题描述

我正在尝试使用图像,但在使用时遇到了一些奇怪的行为Encoder.Quality

我有这样的代码:

try
{
    Image myImage = Image.FromStream(file.OpenReadStream());

    string final = "";

    MemoryStream ts = new MemoryStream();
    SaveJpeg(ts, myImage, 100);
    final += (ts.Capacity * 0.0009765625).ToString("0") + ", ";

    for (int i = 0; i <= 10; i++)
    {
        MemoryStream testStream = new MemoryStream();
        SaveJpeg(testStream, myImage, i * 10);
        final += (testStream.Capacity * 0.0009765625).ToString("0") + ", ";
    }
    return Json(final);
}
catch (Exception ex)
{
    return View("Error", ex.ToString());
}




public static void SaveJpeg(string path, Image img, int quality)
{
    if (quality < 0)
        quality = 0;
    if (quality > 100)
        quality = 100;

    // Encoder parameter for image quality 
    EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
    // JPEG image codec 
    ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = qualityParam;
    img.Save(path, jpegCodec, encoderParams);
}
public static void SaveJpeg(Stream stream, Image img, int quality)
{
    if (quality < 0)
        quality = 0;
    if (quality > 100)
        quality = 100;

    // Encoder parameter for image quality 
    EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
    // JPEG image codec 
    ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = qualityParam;
    img.Save(stream, jpegCodec, encoderParams);
}

/// <summary> 
/// Returns the image codec with the given mime type 
/// </summary> 
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    // Get image codecs for all image formats 
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

    // Find the correct image codec 
    for (int i = 0; i < codecs.Length; i++)
        if (codecs[i].MimeType == mimeType)
            return codecs[i];

    return null;
}

它是 asp.net 核心,但我认为这并不重要。

这里重要的是我上传的文件是“jpg”,它的大小是201kb但此代码的输出是512, 29, 41, 53, 128, 128, 128, 128, 128, 128, 256, 512, (第一个数字是质量 100,其他数字是 0、10、20...100)

当我在MemoryStream不改变质量的情况下存储它时,我得到的文件大小与我的文件相同。

这里我有两个问题。

标签: c#

解决方案


推荐阅读