Convertire un'immagine in scala di grigio
-
20-09-2019 - |
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
.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.
Nessuno degli esempi sopra creare immagini a 8 bit (8bpp) bitmap. Alcuni software, come ad esempio l'elaborazione delle immagini, supporta solo 8bpp. Purtroppo le librerie MS .NET non hanno una soluzione. Il formato PixelFormat.Format8BPPIndexed sembra essere molto promettente, ma dopo un sacco di tentativi non ho potuto farlo funzionare.
Per creare un vero e proprio file bitmap a 8 bit è necessario creare il intestazioni appropriate . In definitiva ho trovato il href="http://www.codeproject.com/KB/recipes/GrayScale.aspx" rel="nofollow noreferrer"> biblioteca soluzione per la creazione di 8-bit bitmap (BMP) File. Il codice è molto semplice:
Image image = Image.FromFile("c:/path/to/image.jpg");
GrayBMP_File.CreateGrayBitmapFile(image, "c:/path/to/8bpp/image.bmp");
Il codice per questo progetto è ben lungi dall'essere abbastanza, ma funziona, con un piccolo problema semplice da-fix. L'autore hard-coded la risoluzione dell'immagine a 10x10. programmi di elaborazione immagini non piace questo. La correzione è GrayBMP_File.cs aperti (sì, la denominazione dei file funky, lo so) e sostituire le linee 50 e 51 con il codice qui sotto. L'esempio imposta la risoluzione a 200x200, ma si dovrebbe cambiare per il numero corretto.
int resX = 200;
int resY = 200;
// horizontal resolution
Copy_to_Index(DIB_header, BitConverter.GetBytes(resX * 100), 24);
// vertical resolution
Copy_to_Index(DIB_header, BitConverter.GetBytes(resY * 100), 28);
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");