Feedback

C# - Bilder bzw. Bitmaps prozentual verdunkeln

Veröffentlicht von am 2/4/2013
(3 Bewertungen)
Mit diesen "paar" Zeilen Code kann man - leider soweit ich weiß auf die einzige Art - Bitmaps (System.Drawing.Bitmap) Prozentual verdunkeln.

>>Da dies eine Pixeloperation ist und das ganze Bild durchlaufen werden muss, kann es bei großen Bildern länger dauern. :( <<

[Edit] Man kann natürlich auch Bilder aufhellen indem man z.B. 150% angibt. :)
private Bitmap DimmImage(string Filename, int Percent)
{
   Bitmap b = new Bitmap(Filename);
   for (int i = 0; i < b.Width; i++)
   {
      for (int k = 0; k < b.Height; k++)
      {
         try
         {
            int percent = percent / 100;
            int newR = Convert.ToInt32(b.GetPixel(i, k).R * percent);
            int newG = Convert.ToInt32(b.GetPixel(i, k).G * percent);
            int newB = Convert.ToInt32(b.GetPixel(i, k).B * percent);
            Color c = Color.FromArgb(newR, newG, newB);
            b.SetPixel(i, k, c);
         }
         catch
         {
         }
      }
   }
   return b;
}

5 Kommentare zum Snippet

Koopakiller schrieb am 2/4/2013:
Abgesehen davon, das der Code sowieso Fehler enthält, (versuche mal 50% helligkeit anzugeben und sieh dir die Farben an) geht eine ColorMatrix um ein Vielfaches schneller. Hier ein kurzes Beispiel:

private void DrawImage(Image img, PaintEventArgs e, Point p, float r)
{
// Lokale Daten
int iWidth = ClientSize.Width / 3;
int iHeight = ClientSize.Height / 3;
Rectangle rectTarget = new Rectangle(
0, 0,
iWidth, iHeight);


float[][] cm = {
new float[]{1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
new float[]{0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
new float[]{0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
new float[]{0.0f, 0.0f, 0.0f, 1.0f, 0.0f},
new float[]{r, r, r, r, 1.0f}};

ColorMatrix colorMatrix = new ColorMatrix(cm);

ImageAttributes imgAttribute = new ImageAttributes();
imgAttribute.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
e.Graphics.DrawImage(img, rectTarget,
p.X,p.Y, img.Width, img.Height,
GraphicsUnit.Pixel, imgAttribute);
}

Diese Methode benötigt Werte zwischen -1 und 1. Also wenn man es korrekt nimmt auch Prozenntwerte.
Jan Welker schrieb am 2/4/2013:
Muss ich zustimmen, GetPixel ist immer die langsamste Lösung.
dariusarnold schrieb am 3/19/2013:
Wo für stehen die Parameter und wie kann ich das ganze einfach einer Draswing.Bitmap oder .Image zuweisen?
Koopakiller schrieb am 3/21/2013:
Hallo,
das wichtigste an dem Code ist die ColorMatrix. Diese kann ein Bild (Genauer die Farben der Pixel) auf bestimmte Art und Weise verändern. Im MSDN Artikel steht ein kleines Beipiel dazu:
<a href="http://msdn.microsoft.com/de-de/library/system.drawing.imaging.colormatrix.aspx">http://msdn.microsoft.com/de-de/library/system.drawing.imaging.colormatrix.aspx</a>
Hier noch eine Seite mit einigen Beipielen:
<a href="http://www.geekpedia.com/tutorial202_Using-the-ColorMatrix-in-Csharp.html">http://www.geekpedia.com/tutorial202_Using-the-ColorMatrix-in-Csharp.html</a>
Dort wird das Bild am Ende über einen kleinen Trick einer PictureBox zugewiesen.
dariusarnold schrieb am 1/29/2014:
Danke..
 

Logge dich ein, um hier zu kommentieren!