Der beste Weg, verblassen in / out Bild
Frage
Was ist die beste (am wenigsten Ressourcen schwer) Art und Weise ein Bild in und aus all 20 Sekunden mit einer Dauer von 1 Sekunde vor einem schwarzen Hintergrund (Bildschirmschoner), in C # zu verblassen?
(ein Bild über 350x130px).
Ich brauche dies für einen einfachen Bildschirmschoner, der auf einigen niedrigen Niveaus Rechner (XP).
laufen losIm Moment bin ich mit dieser Methode gegen einen PictureBox, aber es ist zu langsam:
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;
}
Lösung
Sie könnten wahrscheinlich eine Farbmatrix wie in diesem Beispiel auf Msdn verwenden
http://msdn.microsoft.com /en-us/library/w177ax15%28VS.71%29.aspx
Andere Tipps
Statt einen Stift und die DrawLine () -Methode verwenden, können Sie Bitmap.LockBits direkt den Speicher Ihres Bildes zuzugreifen. Hier ist ein gute Erklärung rel="nofollow , wie es funktioniert.
Setzen Sie einen Timer auf dem Formular, und im Konstruktor oder die Form_Load, schreiben
timr.Interval = //whatever interval you want it to fire at;
timr.Tick += FadeInAndOut;
timr.Start();
Fügen Sie eine private Methode
private void FadeInAndOut(object sender, EventArgs e)
{
Opacity -= .01;
timr.Enabled = true;
if (Opacity < .05) Opacity = 1.00;
}
Hier ist mein nehmen auf diese
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;
}
Es ist auch ein anderer Thread zu erstellen empfohlen, da dies Ihre wichtigste einzufrieren.