Il modo migliore per dissolvenza in image / out
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;
}
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.