2009-12-01 66 views
1

在C#中,對於黑色背景(屏幕保護程序),每20秒持續1秒鐘淡入淡出圖像的最佳方式是什麼?淡入/淡出圖像的最佳方式

(約350x130px的圖片)。

我需要一個簡單的屏幕保護程序,它將在一些低級別計算機上運行(xp)。

現在,我對使用一個PictureBox這種方法,但實在是太慢了:

private Image Lighter(Image imgLight, int level, int nRed, int nGreen, int nBlue) 
    { 
     Graphics graphics = Graphics.FromImage(imgLight); 
     int conversion = (5 * (level - 50)); 
     Pen pLight = new Pen(Color.FromArgb(conversion, nRed, 
          nGreen, nBlue), imgLight.Width * 2); 
     graphics.DrawLine(pLight, -1, -1, imgLight.Width, imgLight.Height); 
     graphics.Save(); 
     graphics.Dispose(); 
     return imgLight; 
    } 

回答

0
你也許可以使用彩色矩陣狀

將定時器放在您的表單上,並在構造函數或Form_Load中,寫入

timr.Interval = //whatever interval you want it to fire at; 
    timr.Tick += FadeInAndOut; 
    timr.Start(); 

添加一個私有方法

private void FadeInAndOut(object sender, EventArgs e) 
{ 
    Opacity -= .01; 
    timr.Enabled = true; 
    if (Opacity < .05) Opacity = 1.00; 
} 
+0

你應該最好使用兩個定時器。一會被設置爲20秒,並通過啓動第二個計時器來觸發淡入淡出。第二個計時器將被設置爲一個很短的時間(例如0.1s),並將增加/減少不透明度,直到淡入淡出完成,然後停止()本身。那麼,你沒有連續運行的高頻計時器。請注意,Forms定時器是臭名昭着的不可靠的,所以使用它們可能不會很順利地淡入淡出 - 但是對於你想要的東西,大多數情況下它們可能都可以。 – 2009-12-01 22:44:28

+0

有趣的是,兩個定時器如何,其中一個定時器在高頻率下連續運行更少,優於同一個高頻率下的單個定時器? – 2009-12-01 23:40:21

0

這裏是我拿到這個

private void animateImageOpacity(PictureBox control) 
    { 
     for(float i = 0F; i< 1F; i+=.10F) 
     { 
      control.Image = ChangeOpacity(itemIcon[selected], i); 
      Thread.Sleep(40); 
     } 
    } 

    public static Bitmap ChangeOpacity(Image img, float opacityvalue) 
    { 
     Bitmap bmp = new Bitmap(img.Width, img.Height); // Determining Width and Height of Source Image 
     Graphics graphics = Graphics.FromImage(bmp); 
     ColorMatrix colormatrix = new ColorMatrix {Matrix33 = opacityvalue}; 
     ImageAttributes imgAttribute = new ImageAttributes(); 
     imgAttribute.SetColorMatrix(colormatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 
     graphics.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imgAttribute); 
     graphics.Dispose(); // Releasing all resource used by graphics 
     return bmp; 
    } 

它也建議創建另一個線程,因爲這將會凍結您的主要原因之一。