我试图保存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;
,我看到文件大小发生了很大变化。
有没有办法更精细地控制文件大小?
阅读MemoryStream.GetBuffer()
的文档:
请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入MemoryStream对象,则从GetBuffer返回的缓冲区长度为256而不是4,未使用252个字节。要仅获取缓冲区中的数据,请使用ToArray方法;但是,ToArray会在内存中创建数据副本。
然后使用.ToArray()
代替。