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

考虑到方形瓷砖的瓷砖尺寸为 150x150 或宽瓷砖的瓷砖尺寸为 310x150,您应该能够将图像缩小到适当的尺寸,并且通过 jpeg 压缩,您几乎可以保证低于 200k。将压缩质量设置为 80 左右。它将为您提供良好的压缩比,同时保持良好的图像质量。

于 2012-10-13T05:57:34.910 回答
1

您不能使用宽度 x 高度 x colourDepth 来计算它吗(其中 colourDepth 以字节为单位,因此 32 位 = 4 字节)。大概你保持纵横比,所以你只需要缩小宽度/高度,直到你发现它小于 200KB。

这假设输出是一个位图,因此是未压缩的。

于 2012-10-12T23:26:41.077 回答