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