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);
}
}