我正在开发一个例程,将一些位图图像缩放为我的Window-8应用程序的图块通知的一部分
平铺图像的尺寸必须小于200KB且小于1024x1024像素。我能够使用缩放例程来根据需要调整源图像的大小以适应1024x1024像素尺寸限制。
如何更改源图像以确保满足尺寸限制?
我的第一次尝试是继续缩小图像,直到它清除大小阈值,并使用isTooBig = destFileStream.Size > MaxBytes
来确定大小。但是,下面的代码导致无限循环。如何可靠地测量目标文件的大小?
bool isTooBig = true;
int count = 0;
while (isTooBig)
{
// create a stream from the file and decode the image
using (var sourceFileStream = await sourceFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
using (var destFileStream = await destFile.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceFileStream);
BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(destFileStream, decoder);
double h = decoder.OrientedPixelHeight;
double w = decoder.OrientedPixelWidth;
if (h > baselinesize || w > baselinesize)
{
uint scaledHeight, scaledWidth;
if (h >= w)
{
scaledHeight = (uint)baselinesize;
scaledWidth = (uint)((double)baselinesize * (w / h));
}
else
{
scaledWidth = (uint)baselinesize;
scaledHeight = (uint)((double)baselinesize * (h / w));
}
//Scale the bitmap to fit
enc.BitmapTransform.ScaledHeight = scaledHeight;
enc.BitmapTransform.ScaledWidth = scaledWidth;
}
// write out to the stream
await enc.FlushAsync();
await destFileStream.FlushAsync();
isTooBig = destFileStream.Size > MaxBytes;
baselinesize *= .90d * ((double)MaxBytes / (double)destFileStream.Size);
}
}
答案 0 :(得分:1)
你能不能使用width x height x colourDepth来计算它(其中colourDepth是以字节为单位,所以32bit = 4bytes)。大概是你保持纵横比,所以你只需要缩小宽度/高度,直到你发现它低于200KB。
这假设输出是一个位图,因此是未压缩的。
答案 1 :(得分:1)
考虑到瓷砖尺寸对于方形瓷砖为150x150或对于宽瓷砖为310x150,您应该能够将图像缩小到适当的尺寸,并且使用jpeg压缩,您几乎可以保证低于200k。将压缩质量设置在80左右。它将为您提供良好的压缩比,同时保持良好的图像质量。