Domanda

Qual è la migliore (almeno risorsa pesante) modo per sfumare un'immagine dentro e fuori ogni 20 secondi con una durata di 1 secondo, contro uno sfondo nero (screensaver), in C #?

(un'immagine su 350x130px).

Ho bisogno di questo per un semplice screensaver che sta per essere eseguito su alcuni computer di basso livello (XP).

In questo momento sto usando questo metodo contro un pictureBox, ma è troppo lento:

    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;
    }
È stato utile?

Soluzione

Si potrebbe forse usare una matrice di colore come in questo esempio su MSDN

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

Altri suggerimenti

Invece di utilizzare una penna e il metodo DrawLine (), è possibile utilizzare Bitmap.LockBits per accedere alla memoria della vostra immagine direttamente. Ecco un buona spiegazione di come funziona.

Mettere un timer sul modulo, e nel costruttore, o il Form_Load, scrivere

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

Aggiungere un metodo privato

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

Ecco il mio prendere su questo

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

E 'anche consigliabile creare un altro thread, perché questo si blocca il vostro principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top