尝试在WPF中缩放位图时,TransformedBitmap.EndInit上是什么导致OverflowException?

时间:2010-12-17 10:52:14

标签: c# .net wpf image-processing

我有以下代码:

private void Process(string path)
    {
        using (FileStream fs = File.OpenRead(path))
        {
            JpegBitmapDecoder decoder = new JpegBitmapDecoder(fs,BitmapCreateOptions.PreservePixelFormat,BitmapCacheOption.Default);
            BitmapSource bmps = decoder.Frames.First();
            double targetScale = 800.0/600.0;
            double scaleX = bmps.PixelWidth*targetScale;
            double scaleY = bmps.PixelHeight*targetScale;
            TransformedBitmap tbmp = new TransformedBitmap();
            tbmp.BeginInit();
            tbmp.Source = bmps;
            tbmp.Transform = new ScaleTransform(scaleX, scaleY);
            tbmp.EndInit();
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(tbmp));
            using (FileStream fs2 = File.OpenWrite(path+".jpg"))
            {
                Debug.WriteLine(path+".jpg");
                encoder.Save(fs2);
            }
        }
    }

它会在OverflowException

处抛出tbmp.EndInit();

知道为什么吗?

UPDATE :值得一提的是,这个方法是通过ParallelQuery调用的。它不依赖于可能在不同线程中的任何东西。

2 个答案:

答案 0 :(得分:2)

您已经计算了所需的比例,800/600。不要乘以图像大小。修正:

  tbmp.Transform = new ScaleTransform(targetScale, targetScale);

答案 1 :(得分:1)

我的猜测是因为你的规模很大。例如,假设原始图片是1600x1200 ...然后你将它缩放2,133.33333x1600倍,最终图片大小为3,413,333 x 1,920,000 - 这是一幅非常巨大的图片!

我怀疑你想要:

double scaleX = targetScale / bmps.PixelWidth;
double scaleY = targetScale / bmps.PixelHeight;

毕竟,我认为如果原始图片更大,你想拉伸更少,而不是更多