Feedback

Bilder bzw. Bitmaps prozentual verdunkeln

Sprache: C#

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;
}
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

  1. 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:
    [code]
    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);
    }
    [/code]
    Diese Methode benötigt Werte zwischen -1 und 1. Also wenn man es korrekt nimmt auch Prozenntwerte.

  2. 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:
    http://msdn.microsoft.com/de-de/library/system.drawing.imaging.colormatrix.aspx
    Hier noch eine Seite mit einigen Beipielen:
    http://www.geekpedia.com/tutorial202_Using-the-ColorMatrix-in-Csharp.html
    Dort wird das Bild am Ende ĂŒber einen kleinen Trick einer PictureBox zugewiesen.