2

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

2 に答える 2

1

width x height x colorDepth (colorDepth はバイト単位なので、32 ビット = 4 バイト) を使用して計算できませんか。おそらくアスペクト比を維持しているので、幅/高さを 200KB 未満になるまで縮小する必要があります。

これは、出力がビットマップであり、したがって圧縮されていないことを前提としています。

于 2012-10-12T23:26:41.077 に答える
1

正方形のタイルの場合は 150x150、幅の広いタイルの場合は 310x150 のいずれかのタイル サイズを考慮すると、画像を適切なサイズに縮小でき、JPEG 圧縮を使用すると、200k 未満であることがほぼ保証されます。圧縮品質を 80 前後に設定します。適切な画質を維持しながら、適切な圧縮率が得られます。

于 2012-10-13T05:57:34.910 に答える