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 Core Server- und Client-Programmierung

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

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!