Domanda

C'è un modo per convertire un'immagine in scala di grigio 16 bit per pixel formato, invece di impostare ognuna delle componenti R, G e B alla luminanza. Al momento ho un bmp da file.

Bitmap c = new Bitmap("filename");

Voglio una bitmap d, che è la versione in scala di grigi di c. Vedo un costruttore che include System.Drawing.Imaging.PixelFormat, ma non capisco come utilizzare tale. Sono nuovo di elaborazione delle immagini e le relative librerie C #, ma hanno un'esperienza moderata con C # per sé.

Qualsiasi aiuto, il riferimento a una fonte online, suggerimento o suggerimento sarà apprezzato.

EDIT: d è la versione in scala di grigi di c

.
È stato utile?

Soluzione

  

"Voglio una bitmap D, che è in scala di grigi.   Vedo un consructor che include   System.Drawing.Imaging.PixelFormat,   ma non capisco come utilizzare   che ".

Ecco come fare questo

Bitmap grayScaleBP = new 
         System.Drawing.Bitmap(2, 2, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);

Modifica Per convertire in scala di grigi

             Bitmap c = new Bitmap("fromFile");
             Bitmap d;
             int x, y;

             // Loop through the images pixels to reset color.
             for (x = 0; x < c.Width; x++)
             {
                 for (y = 0; y < c.Height; y++)
                 {
                     Color pixelColor = c.GetPixel(x, y);
                     Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
                     c.SetPixel(x, y, newColor); // Now greyscale
                 }
             }
            d = c;   // d is grayscale version of c  

Più veloce Versione da switchonthecode clicca per l'analisi completa:

public static Bitmap MakeGrayscale3(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;
}

Altri suggerimenti

Bitmap d = new Bitmap(c.Width, c.Height);

for (int i = 0; i < c.Width; i++)
{
    for (int x = 0; x < c.Height; x++)
    {
        Color oc = c.GetPixel(i, x);
        int grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
        Color nc = Color.FromArgb(oc.A, grayScale, grayScale, grayScale);
        d.SetPixel(i, x, nc);
    }
}

In questo modo si mantiene anche il canale alfa.
Godetevi.

C'è un metodo statico della classe ToolStripRenderer, denominata CreateDisabledImage. Il suo utilizzo è semplice come:

Bitmap c = new Bitmap("filename");
Image d = ToolStripRenderer.CreateDisabledImage(c);

Si utilizza una matrice diversa po 'da quello in risposta accettata e inoltre lo moltiplica per una trasparenza del valore di 0,7, quindi l'effetto è leggermente diverso di una semplice scala di grigi, ma se si vuole ottenere solo la vostra immagine in grigio, è la soluzione più semplice e migliore.

Per riassumere alcuni elementi qui: Ci sono alcune opzioni di pixel-by-pixel che, pur essendo semplice, basta non sono veloci.

commento

@Luis' collegamento a: (archiviata) https://web.archive.org/web/20110827032809/http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a- color-image-to-scala di grigi è superba.

Corre attraverso tre diverse opzioni e include tempi per ciascuno.

Il codice che segue è la soluzione più semplice:

Bitmap bt = new Bitmap("imageFilePath");

for (int y = 0; y < bt.Height; y++)
{
    for (int x = 0; x < bt.Width; x++)
    {
        Color c = bt.GetPixel(x, y);

        int r = c.R;
        int g = c.G;
        int b = c.B;
        int avg = (r + g + b) / 3;
        bt.SetPixel(x, y, Color.FromArgb(avg,avg,avg));
    }   
}

bt.Save("d:\\out.bmp");
scroll top