2013-05-29 43 views
1

我有這段代碼運行它所做的是流RDLC文件,將其轉換爲圖像並保存它。該流是在手之前創建並保存在內存中的。 我面臨的問題是這個功能非常慢。它需要2-3秒才能執行。 執行此線需要大部分時間更快的圖形DrawImage

 graphics.DrawImage(imge, adjustedRect); 

最大。我怎樣才能讓它更快,請幫助。

public void PrintImagePage(int PageNo) 
    { 
     try 
     { 
      Metafile imge; 
      Graphics graphics; 
      Image pageImage; 
      PageNo = PageNo - 1; 
      if (m_streams == null || m_streams.Count == 0) 
       throw new Exception("Error: no stream to print."); 


      m_streams[PageNo].Position = 0; 
      string filePath = _folderPath + _fileNamePrifix + PageNo + ".png"; 
      imge = new Metafile(m_streams[PageNo]); 
      pageImage = new Bitmap(imge.Width, imge.Height); 
      graphics = Graphics.FromImage(pageImage); 

      Rectangle adjustedRect = new Rectangle(
       0, 
       0, 
       pageImage.Width, 
       pageImage.Height); 
      graphics.FillRectangle(Brushes.White, adjustedRect); 

      // Draw the report content 
      graphics.DrawImage(imge, adjustedRect); 
      pageImage = ResizeBitmap(pageImage, .35f, InterpolationMode.HighQualityBicubic); 
      pageImage.Save(filePath, ImageFormat.Png); 
      //using (var m = new MemoryStream()) 
      //{ 
      // pageImage.Save(filePath, ImageFormat.Png); 

      // var img = Image.FromStream(m); 

      // img.Save(filePath); 
      // img.Dispose(); 
      //} 
      imge.Dispose(); 
      graphics.Dispose(); 
      pageImage.Dispose(); 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
+1

我記得這個功能只是照明很快。你在處理非常大的圖像嗎? – Naruil

+0

是的原始圖像非常大。那爲什麼我在保存之前調整它大小 – thewayman

+0

只是不要調整大小。首先創建合適的大小,並將您的循環保存到DrawImage()中。獲得像素格式匹配非常重要。如果你想要更快,那麼你需要解決更小的插值模式。 –

回答

1

至於你的問題,不,我不認爲有一種方法來加快圖形類。

我之前沒有使用Metafiles,所以我不知道什麼是快速和慢。但據我所知,它基於之前完成的繪製操作(像某些客戶端或某個東西)重新創建圖像。

難道你的圖元文件中有很多繪圖操作嗎?所以也許這是一個更好的解決方案,只需在客戶端上創建圖像,然後發送圖像?

[編輯]或者不使用Graphics類和創建你自己的?[/編輯]

+0

imge =新的圖元文件(m_streams [PageNo]);那裏有一個由報告工具創建的流,而不是放在一個新的圖元文件上 – thewayman

+0

也許可以首先將流下載到內存流中,然後根據該MemoryStream創建映像?也許I/O花費了很多時間。 (只是猜測在這裏;) – ikwillem

+0

它在記憶流中 – thewayman

1

哦,我明白了。如果你正在處理非常大的圖像。你實際上是

  1. 轉換圖元文件到一個大的位圖
  2. 調整位

我建議你只是把它轉換到一個較小的位圖中的一個步驟。

pageImage = new Bitmap(imge.Width * 0.35f, imge.Height * 0.35f);

,並刪除調整大小碼

//pageImage = ResizeBitmap(pageImage, .35f, InterpolationMode.HighQualityBicubic);

如果解決不了你的問題,這意味着你的圖元文件是太複雜的渲染。在這種情況下,緩慢的DrawImage是不可避免的。您可能會考慮一些推測技術(在需要之前猜測並渲染圖像)以涵蓋此函數的延遲。

1

您可以使用圖形的內置變換和重新採樣功能將其繪製到較小的矩形。

graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
float scale = 0.35f; 
graphics.Transform = new System.Drawing.Drawing2D.Matrix(scale, 0.0f, 0.0f, scale, 0.0f, 0.0f); 

這將讓你大圖像繪製到使用相同的繪圖調用一個較小的一個:

graphics.DrawImage(imge, adjustedRect); 

的變換是一個2×2矩陣和位置偏移。通過將矩陣的左上角和右下角元素設置爲您創建比例變換的比例。這樣,重新調整大小是儘快完成的。這消除了第二次複製/重新大小的需要。