1

C#で、黒い背景(スクリーンセーバー)に対して、1秒の長さで20秒ごとに画像をフェードインおよびフェードアウトするための最良の(リソースの負荷が最も少ない)方法は何ですか?

(約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;
    }
4

4 に答える 4

3

おそらく、msdnでこの例のようなカラーマトリックスを使用できます。

http://msdn.microsoft.com/en-us/library/w177ax15%28VS.71%29.aspx

于 2009-12-01T22:26:19.037 に答える
1

PenとDrawLine()メソッドを使用する代わりに、Bitmap.LockBitsを使用して画像のメモリに直接アクセスできます。これがどのように機能するかについての良い説明です。

于 2009-12-01T22:31:11.667 に答える
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;
}
于 2009-12-01T22:31:10.043 に答える
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;
    }

メインスレッドがフリーズするため、別のスレッドを作成することもお勧めします。

于 2013-06-17T09:31:25.383 に答える