2010-12-17 53 views
2

我有以下代碼:嘗試在WPF中縮放位圖時,TransformedBitmap.EndInit上的OverflowException是什麼?

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); 
      } 
     } 
    } 

它拋出一個OverflowExceptiontbmp.EndInit();

任何想法,爲什麼?

UPDATE:值得一提的是,這個方法是通過ParallelQuery調用的。它不依賴於任何可能在不同線程中的東西。

+1

_scaleX_和_scaleY_會** **巨大**。也許是這樣。 – 2010-12-17 10:55:51

回答

2

您已經計算出所需的縮放比例,800/600。不要乘以圖像大小。修復:

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

它不工作,只是讓它們變大。 – 2010-12-20 08:49:40

+0

你改變了你的問題。這個答案告訴你爲什麼你有異常,你的原始問題。 – 2010-12-20 09:03:17

+0

哦,對,我的壞,我似乎有點鬆散的軌道,我會改回來,並打開一個新的話題:) – 2010-12-20 10:12:03

1

我的猜測是,這是因爲你的規模很大。例如,假設原始圖片爲1600x1200 ......然後將其縮放2,133.33333x1600倍,最終圖片尺寸爲3,413,333 x 1,920,000,這是一幅相當巨大的圖片!

我懷疑你想要的東西:

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

畢竟,我認爲,如果原始圖片比較大,你要舒展是,不更多

+0

我改變了它,但現在我得到的圖像是1×1和黑色(1​​個黑色像素)。 – 2010-12-17 11:02:01