Feedback

C# - Bilder bzw. Bitmaps prozentual verdunkeln

Veröffentlicht von am 04.02.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. :)
GFU-Schulungen  [Anzeige]

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

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 04.02.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 04.02.2013:
Muss ich zustimmen, GetPixel ist immer die langsamste Lösung.
dariusarnold schrieb am 19.03.2013:
Wo für stehen die Parameter und wie kann ich das ganze einfach einer Draswing.Bitmap oder .Image zuweisen?
Koopakiller schrieb am 21.03.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 29.01.2014:
Danke..
 

Logge dich ein, um hier zu kommentieren!