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

C# 当尝试在WPF中缩放位图时,是什么导致TransformedBitmap.EndInit上出现OverflowException?,c#,.net,wpf,image-processing,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);

我有以下代码:

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);
            }
        }
    }
它在
tbmp.EndInit()处抛出一个
OverflowException

知道为什么吗


更新:值得一提的是,此方法是通过并行查询调用的。但这并不取决于其他线程中的任何内容。

我的猜测是,这是因为您的规模很大。例如,假设原始图片是1600x1200。。。然后按2133.33333x1600的倍数缩放,最终图片大小为3413333x11920000,这是一张非常大的图片

我怀疑你想要:

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

毕竟,我假设如果原始图片更大,则您想要拉伸的范围更小,而不是更大。

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

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

scaleX和scaleY会很强大。可能是这样。我改成了那样,但现在我得到的图像是1 x 1和黑色(1个黑色像素)。你改变了你的问题。这个答案告诉你为什么你得到了这个例外,你最初的问题。哦,对了,我的错,我有时似乎忘记了这一点,我会把它改回来,打开一个新的话题:)