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个黑色像素)。你改变了你的问题。这个答案告诉你为什么你得到了这个例外,你最初的问题。哦,对了,我的错,我有时似乎忘记了这一点,我会把它改回来,打开一个新的话题:)