我有以下代码:
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调用的。它不依赖于可能在不同线程中的任何东西。
答案 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;
毕竟,我认为如果原始图片更大,你想拉伸更少,而不是更多。