Wie finde ich, dass alle Pixel in einem Bild Graustufen sind oder R, G, B für jedes einzelne Pixel den gleichen Wert haben?

Bitte zitiere nicht diesesWie kann ich die Farbtiefe einer Bitmap überprüfen? oder So überprüfen Sie, ob ein Bild in grayScale @ i

Weil ein Bild 24/32 Bit pro Pixel haben kann, auch wenn alle eindeutigen Farben Graustufen oder weniger als 256 sind und jedes Pixel 24 oder 32 Bit haben kann.

Wie finde ich, dass das Pixel in einem BildBitmap.GetPixel(x, y) hat die gleichen R-, G- und B-Werte, sodass ich herausfinden kann, ob alle Pixel in einem Bild im Graustufenbereich liegen. Weil der R, G, B-Wert eines Graustufenpixels gleich ist. Oder gibt es einen besseren Weg zu finden, ob das Bild in Graustufen ist?

Ich schreibe einen Code zum Komprimieren der Größe eines 16/24/32-Bit-Bilds. Wenn das Bild 256 eindeutige Farben hat, ändern Sie es in ein 8-Bit-Bild und speichern Sie es.

Zunächst zähle ich eindeutige Farben in einem Bild mit mehr als 8 Farben pro Pixel.

Wenn die eindeutigen Farben im Bild kleiner oder gleich 256 sind, dann

Wenn sich alle eindeutigen Farben im Graustufenbereich befinden, konvertieren Sie sie in GraustufenWenn sonst eine Farbe nicht in Graustufen angezeigt wird, konvertieren Sie das Bild in 8 BPP

uint UniqueColors(Bitmap Bitmap)
{
    try
    {
        List<int> lstColors = new List<int>();

        if (null == Bitmap)
            return 0;

        for (int iCount = 0; iCount < Bitmap.Height; iCount++)
            for (int iCounter = 0; iCounter < Bitmap.Width; iCounter++)
                if (!lstColors.Contains(Bitmap.GetPixel(iCounter, iCount).ToArgb()))
                    lstColors.Add(Bitmap.GetPixel(iCounter, iCount).ToArgb());

        Bitmap.Dispose();

        return Convert.ToUInt32(lstColors.Count);
    }
    catch (Exception)
    {
        Bitmap.Dispose();
        return 0;
    }
}

Und dann

if (256 >= UniqueColors(new Bitmap(string ImagePath)))
{
    if (Is_Greyscale(new Bitmap(ImagePath))
        Convert_To_Greyscale(ImagePath);
    else
        Convert_To_8Bits(ImagePath);
}

Jetzt stecke ich fest, wie ich finde, ob jede einzelne Farbe im Bild in der Graustufenwut liegt. Womit ich meine, dass jede einzelne Farbe gleiche (R, G, B) Werte hat. Wie R = G = B. Wie finde ich es in meiner Codezeile

Bitmap.GetPixel(iCounter, iCount).ToArgb()

Antworten auf die Frage(4)

Ihre Antwort auf die Frage