c# - 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
不改变质量的情况下存储它时,我得到的文件大小与我的文件相同。
这里我有两个问题。
- 质量级别 90-100 是否以某种方式“提高”图像质量?
- 为什么 40-90 级的图像大小都相同,这有什么区别吗?
解决方案
推荐阅读
- makefile - 是什么导致我的 CMake 多目标模式错误?
- sql - 如何使用 SQL 查询不同的数据组
- button - 如何使用 SwiftUI 将参数传递给 Button 的操作
- sql - 用于平滑 postgresql 中缺失数据的窗口函数
- c++ - 如何解决“命名空间'std'中的'mutex'没有命名类型”?
- javascript - 从自定义页面访问登录的 CRM 用户
- ios - mac终端上的cordova权限被拒绝
- java - 后台服务在 API 28 上使应用程序崩溃,但在 API 23 上有效
- python - Selenium Python 使用键盘快捷键打开组中的所有 Facebook 帖子
- python - 什么是 Instagram 机器人请求限制?