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

问题描述 投票:0回答:1

我试图保存WriteableBitmap,并确保生成的文件低于一定的大小。我的代码如下

//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;,我看到文件大小发生了很大变化。

有没有办法更精细地控制文件大小?

c# visual-studio jpeg
1个回答
2
投票

阅读MemoryStream.GetBuffer()的文档:

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

然后使用.ToArray()代替。

© www.soinside.com 2019 - 2024. All rights reserved.