2011-09-06 17 views
2

我已經得到了在其中有文字的圖片。我已經通過使用ColorMatrix將該圖片轉換爲灰度。如何增加C#中圖片的色調?

public Bitmap MakeGrayscale(Bitmap original) 
{ 
    //create a blank bitmap the same size as original 
    Bitmap newBitmap = new Bitmap(original.Width, original.Height); 

    //get a graphics object from the new image 
    Graphics g = Graphics.FromImage(newBitmap); 

    //create the grayscale ColorMatrix 
    ColorMatrix colorMatrix = new ColorMatrix(
     new float[][] 
     { 
    new float[] {.3f, .3f, .3f, 0, 0}, // 30% red. 
    new float[] {.59f, .59f, .59f, 0, 0}, // 59% green. 
    new float[] {.11f, .11f, .11f, 0, 0}, // 11% blue. 
    new float[] {0, 0, 0, 1, 0}, 
    new float[] {0, 0, 0, 0, 1} 
      }); 

    //create some image attributes 
    ImageAttributes attributes = new ImageAttributes(); 


    //set the color matrix attribute 
    attributes.SetColorMatrix(colorMatrix); 

    //draw the original image on the new image 
    //using the grayscale color matrix 
    g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height), 
     0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes); 

    //dispose the Graphics object 
    g.Dispose(); 
    return newBitmap; 
} 

現在,這是一個相當灰度(黑白色調)。我想增加黑色的色調,使我可以用Photoshop做的黑暗。請讓我知道如何在C#中實現這一點?

請讓我知道。

乾杯! :)

回答

1

一種方法是普遍執行的像素更暗,嘗試遍歷的位圖的所有像素(物體色彩),並與新的顏色,其是由一個個較深 取代他們這段代碼可以幫助

/// <summary> 
    /// Darkens the immage, giving a number greater then one will not brighten the image correctly 
    /// </summary> 
    /// <param name="bmp">The bitmap to darken</param> 
    /// <param name="multiplier">The multiplier, should be less then oen to darker the picture</param> 
    static void DarkenImage(Bitmap bmp, double multiplier) 
    { 
     for (int i = 0; i < bmp.Width; i++) 
     { 
      // Iterates over all the pixels 
      for (int j = 0; j < bmp.Height; j++) 
      { 
       // Gets the current pixel 
       var currentPixel = bmp.GetPixel(i, j); 

       // Assigns each value the multiply, or the max value 255 
       var newPixel = Color.FromArgb(
        Math.Min((byte)255, (byte)(currentPixel.R * multiplier)), 
        Math.Min((byte)255, (byte)(currentPixel.G * multiplier)), 
        Math.Min((byte)255, (byte)(currentPixel.B * multiplier)) 
        ); 

       // Sets the pixel 
       bmp.SetPixel(i, j, newPixel); 
      } 
     } 
    }