Un semplice algoritmo per verificare il colore: Cammina l'immagine pixel per pixel in un ciclo annidato per larghezza e altezza e verifica se i valori RGB del pixel sono uguali. Se non lo sono, l'immagine ha informazioni sul colore. Se lo fai completamente attraverso tutti i pixel senza incontrare questa condizione, allora hai un'immagine in scala di grigi.
Revisione con un algoritmo più complesso:
Nel primo giro di questo post ho proposto un semplice algoritmo che presuppone che i pixel sono scala di grigi se RGB di ciascun pixel sono valori sono uguali. Quindi RGBs di 0,0,0 o 128,128,128 o 230,230,230 verrebbero tutti testati come grigio mentre 123,90,78 non lo farebbero. Semplice.
Ecco uno snippet di codice che verifica una varianza dal grigio. I due metodi sono una piccola sottosezione di un processo più complesso ma dovrebbero fornire abbastanza codice raw per aiutare con la domanda originale.
/// <summary>
/// This function accepts a bitmap and then performs a delta
/// comparison on all the pixels to find the highest delta
/// color in the image. This calculation only works for images
/// which have a field of similar color and some grayscale or
/// near-grayscale outlines. The result ought to be that the
/// calculated color is a sample of the "field". From this we
/// can infer which color in the image actualy represents a
/// contiguous field in which we're interested.
/// See the documentation of GetRgbDelta for more information.
/// </summary>
/// <param name="bmp">A bitmap for sampling</param>
/// <returns>The highest delta color</returns>
public static Color CalculateColorKey(Bitmap bmp)
{
Color keyColor = Color.Empty;
int highestRgbDelta = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
if (GetRgbDelta(bmp.GetPixel(x, y)) <= highestRgbDelta) continue;
highestRgbDelta = GetRgbDelta(bmp.GetPixel(x, y));
keyColor = bmp.GetPixel(x, y);
}
}
return keyColor;
}
/// <summary>
/// Utility method that encapsulates the RGB Delta calculation:
/// delta = abs(R-G) + abs(G-B) + abs(B-R)
/// So, between the color RGB(50,100,50) and RGB(128,128,128)
/// The first would be the higher delta with a value of 100 as compared
/// to the secong color which, being grayscale, would have a delta of 0
/// </summary>
/// <param name="color">The color for which to calculate the delta</param>
/// <returns>An integer in the range 0 to 510 indicating the difference
/// in the RGB values that comprise the color</returns>
private static int GetRgbDelta(Color color)
{
return
Math.Abs(color.R - color.G) +
Math.Abs(color.G - color.B) +
Math.Abs(color.B - color.R);
}
fonte
2009-12-09 22:36:43
Il controllo del tipo di immagine non ha intenzione di tagliarlo poiché sarà impostato su 24 o 32 bit (poiché la scansione è a colori). Probabilmente dovrai controllare ciascun pixel; se R == G == B in tutti i pixel, è un'immagine in scala di grigi, altrimenti è probabilmente il colore. –
Un pensiero: anche se lo scanner in teoria sta fornendo R == G == B, è possibile che durante la compressione JPEG ci possono essere alcuni pixel in cui questo è solo quasi vero? Considerare, JPEG è un algoritmo di compressione con perdita. Forse JPEG prende alcune libertà con i colori dei pixel nelle vicinanze. Ma confesso, non sono un esperto di JPEG. Ma io vorrei sapere come funzionava prima che mi sono affidato a R == == G B. –
Sì, non vorrei contare su esattamente r == g == b perché anche se jpg non fa alcuna fudging (e scommetto che lo faccia), lo scanner e l'originale dovrebbero essere perfetti, il che mi sembra improbabile in molti casi. – Beska