调整JpegBitmapEncoder QualityLevel时,为什么文件大小不会总是改变?

时间:2019-04-08 17:23:16

标签: c# visual-studio jpeg

我正在尝试保存WritableBitmap,并确保生成的文件小于特定大小。我的代码如下

//Fetch Image from file
BitmapImage bitmap = new BitmapImage(new Uri("YourImage.jpg", UriKind.Relative));
WriteableBitmap writableBitmapImage = new WriteableBitmap(bitmap);

//initialize variables and values
MemoryStream stream;
JpegBitmapEncoder encoder;
byte[] result;
int quality = 100;

//loop through save process, checking file size and changing quality
while (selected.maxFileSize < result.Length && quality > 1)
{
    encoder = new JpegBitmapEncoder();
    stream = new MemoryStream();
    encoder.QualityLevel = quality;
    encoder.Frames.Add(BitmapFrame.Create(
        ReplaceTransparency(writableBitmapImage, Colors.White))
    );
    encoder.Save(stream);
    result = stream.GetBuffer();
    if (quality > 5) quality += -5;
    else quality--;
}

运行此代码时,没有看到文件大小从QualityLevel = 100;QualityLevel = 10;的变化。

QualityLevel = 5;,我看到文件大小有很大变化。

有什么方法可以更精细地控制文件大小?

1 个答案:

答案 0 :(得分:2)

阅读MemoryStream.GetBuffer()的文档:

  

请注意,缓冲区包含分配的字节,这些字节可能未使用。例如,如果将字符串“ test”写入MemoryStream对象,则从GetBuffer返回的缓冲区的长度为256,而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用ToArray方法。但是,ToArray会在内存中创建数据的副本。

然后使用.ToArray()