2013-03-05 2 views
1

J'essaie d'enregistrer un fichier JPEG en tant qu'image en niveaux de gris.Enregistrer le JPEG en mode couleur en niveaux de gris

J'ai trouvé le code ci-dessous qui va faire il en niveaux de gris en mélangeant les canaux, mais il a toujours les trois canaux RVB. J'ai seulement besoin d'un canal 8 bits.

public static 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}, 
      new float[] {.59f, .59f, .59f, 0, 0}, 
      new float[] {.11f, .11f, .11f, 0, 0}, 
      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; 
    } 

Est-il possible en C# de définir réellement le mode couleur de JPEG?

J'ai essayé ce qui suit, mais il sort toujours une image RVB 24 bits.

  ImageCodecInfo codec = GetEncoderInfo("image/jpeg"); 
      System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.ColorDepth; 
      EncoderParameters encParams = new EncoderParameters(1); 
      encParams.Param[0] = new EncoderParameter(enc, 8L); 

      source_bitmap.Save(outputFile, codec, encParams); 
+0

Non directement liée à votre code, mais peut aider http://www.codeproject.com/Articles/70442/C-RGB-to-Palette-Based-8-bit-Greyscale-Bitmap -Clas – keyboardP

Répondre

1

Il existe différents niveaux de gris pouvant être compilés en tant que combinaison linéaire des trois canaux de votre image.

La plus communément utilisée est 'Luminosité' mais elle diffère en fonction de votre image. See this

Convertir en Luminosity prendre Niveaux de gris

greyscale = 0.21 * R + 0.71 * G + 0.07 * B 

Où R, G et B sont vos rouge, vert et bleu, respectivement, et étant donné qu'ils sont sur une échelle de 0 à 1. Si elles sont sur une échelle de 255, diviser par 255

Questions connexes