2011-02-04 84 views
0

我使用DrawImage Image函數將圖像中的一部分複製到另一個圖像。 是否有可能使複製的部分變得更「黑暗」?喜歡,特殊的色調?有人能給我一個例子嗎?我聽說過ImageAttributes,但我找不到它!Graphics.DrawImage變暗了?

注意:我不想編輯源圖像。

+0

我剛寫了一個關於這個例程的執行速度緩慢的問題的答案,但注意到當我試圖提交我的答案時,這個問題已被刪除。你是否已經解決了這個問題,或者只是認爲它是無關緊要的? – 2011-02-05 06:27:42

+0

我設法優化了應用程序的性能。但是我絕對有興趣聽到你的想法! – Voldemort 2011-02-05 06:41:23

回答

1

的drawImage方法甚至有一個特殊的過載,設置一個ImageAttributes對象正是出於這個原因:

private void Example(PaintEventArgs e) 
{ 
    ImageAttributes imageAttr = new ImageAttributes(); 
    imageAttr.SetGamma(2.2f); 

    Rectangle rect = new Rectangle(250, 20, 200, 200); 
    e.Graphics.DrawImage(myImage, rect, 0, 0, 200, 200, GraphicsUnit.Pixel, imageAttr);  
} 
1

 (不一定是直接回答這個問題,但後續疑問,指定ImageAttributesDrawImage方法導致性能降低,這問題是 因爲刪除了,但我在這裏發佈我的迴應呢,因爲我已經寫好了。如果你想忽略。)

繪圖圖形很慢,尤其是當您同時應用渲染效果時。花幾分鐘在Photoshop中工作,你會明白我的意思。變暗圖像是一項計算成本很高的任務。你可以做些什麼來讓它變得更快。

這個問題進一步加劇了.NET Framework中的System.Drawing.Graphics類中的例程在內部使用GDI +實現,這是而不是硬件加速。一種可能的選擇是切換回基於GDI的渲染,這是在大多數系統上進行硬件加速(這取決於您的視頻卡的供應商,但幾乎所有您今天會發現的顯卡都具有硬件加速功能,以實現比特塊傳輸等基本功能) 。當然,這要困難得多,因爲您需要從Windows API的P/Invoke函數來使用基於GDI的繪圖例程; .NET爲你提供的所有東西都是GDI +。這比完成更多的工作,現代硬件上的速度改進可能是最小的(特別是啓用了Windows Vista/7的Aero主題,即使使用GDI也不使用硬件加速,因爲所有內容都被繪製到內存中的位圖) 。

當前實現,一對夫婦可能的優化的堅持就又映入腦海:

  1. 你是否調整圖像大小,當你重繪?如果是這樣,那就要求圖像被內插,相比之下,這是非常慢的。

  2. 什麼PixelFormat是圖像? Format32bppPArgb比替代方案快得多。確保您使用該格式的圖像。如果你不是現在,做這個改變應該會看到你的渲染速度大幅增加。

  3. 爲什麼你需要經常重新渲染圖像?如果它是相同的圖像,請在應用效果時繪製它並緩存返回的Bitmap對象。然後每次需要重新繪製圖像時,請使用已在內存中的圖像,而不是創建一個新圖像。這是一個簡單的訣竅,但它使您不必每次都要再次做昂貴的零件。正如你所提到的,單獨的DrawImage比設置渲染屬性要快得多。

一般而言,用戶願意等待大圖像呈現。相應地設置界面比嘗試優化圖形例程更合適。使用進度條和忙碌光標來表示實際發生的事情,就用戶而言,將進一步得多,而不是從代碼中擠出幾毫秒。除非你在一個循環中反覆應用這個效果大約100或1000次(這看起來非常愚蠢),否則它不值得花費時間進行優化。