He buscado en todas partes pero no parece haber un estándar (podría ver) de cómo se verificaría para ver si una imagen está en blanco. En C#Comprobación para ver si una imagen está en blanco en C#
Tengo una forma de hacerlo, pero me encantaría saber cuál es la forma correcta de verificar si una imagen está en blanco, para que todos puedan saberlo en el futuro.
No voy a copiar pegar un montón de código, si quieres, será un placer, pero primero quiero explicar cómo voy a verificar para ver si una imagen está en blanco.
Toma una imagen .jpg, obtenga el ancho de la misma. Por ejemplo 500 píxeles A continuación, a dividir esta en un 2 que le da 250
Luego de comprobar cuál es el color de cada píxel se encuentra en la ubicación de (250 ancho, y altura) (donde iterar pensaba que la altura del imagen
Lo que esto hace es verificar la línea media de píxeles de una imagen, verticalmente. Revisa todos los píxeles para ver si el color es cualquier cosa excepto blanco. He hecho esto para que no tengas para buscar ALL 500 * altura de píxeles y dado que casi siempre encontrará un color en el medio de la página.
Su funcionamiento ... un poco lento ... Debe haber un mejor manera de hacer esto? Puede cambiarlo para buscar 2/3/4 líneas verticalmente para aumentar su posibilidad de detectar una página que no está en blanco, pero eso llevará incluso más tiempo.
(Tenga en cuenta también, utilizando el tamaño de la imagen para comprobar si contiene algo no funciona en este caso, ya que una página con dos frases sobre y el tamaño de una página en blanco es demasiado cerca uno del otro)
Después de que se haya agregado la solución.
Recursos para ayudar con la implementación y la comprensión de la solución.
- Writing unsafe code - pointers in C
- Using Pointers in C#
- /unsafe (C# Compiler Options)
- Bitmap.LockBits Method (Rectangle, ImageLockMode, PixelFormat)
(Tenga en cuenta que en la primera página web, el Pizelformat indicado es en realidad PixelFormat) - Pequeño error lo sé, sólo mencionar, podría causa cierta confusión a algunos.
Después de implementar el método para acelerar la búsqueda de píxeles, la velocidad no aumentó tanto. Entonces, creo que estoy haciendo algo mal.
Tiempo anterior = 15.63 para 40 imágenes.
Nueva tiempo = 15,43 por 40 imágenes
vi con el gran artículo DocMax quoted, que el código "bloquea" en un conjunto de píxeles. (o así es como lo entendí) Entonces, lo que hice fue bloquear en la fila central de píxeles de cada página. ¿Ese sería el movimiento correcto para hacer?
private int testPixels(String sourceDir)
{
//iterate through images
string[] fileEntries = Directory.GetFiles(sourceDir).Where(x => x.Contains("JPG")).ToArray();
var q = from string x in Directory.GetFiles(sourceDir)
where x.ToLower().EndsWith(".jpg")
select new FileInfo(x);
int holder = 1;
foreach (var z in q)
{
Bitmap mybm= Bitmap.FromFile(z.FullName) as Bitmap;
int blank = getPixelData2(mybm);
if (blank == 0)
{
holder = 0;
break;
}
}
return holder;
}
Y entonces la clase
private unsafe int getPixelData2(Bitmap bm)
{
BitmapData bmd = bm.LockBits(new System.Drawing.Rectangle((bm.Width/2), 0, 1, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
int blue;
int green;
int red;
int width = bmd.Width/2;
for (int y = 0; y < bmd.Height; y++)
{
byte* row = (byte*)bmd.Scan0 + (y * bmd.Stride);
blue = row[width * 3];
green = row[width * 2];
red = row[width * 1];
// Console.WriteLine("Blue= " + blue + " Green= " + green + " Red= " + red);
//Check to see if there is some form of color
if ((blue != 255) || (green != 255) || (red != 255))
{
bm.Dispose();
return 1;
}
}
bm.Dispose();
return 0;
}
¿Ha cronometrado cuánto tiempo lleva? Si es así, ¿cuál fue el tiempo y cuál fue el alto de la imagen? – 3aw5TZetdf
Debe estar haciendo algo mal en su implementación, porque su algoritmo me parece correcto. No debería tomarse un tiempo para escanear una columna de un mapa de bits. –
Tiempo total para 32 imágenes = 00: 00: 12.9187389 Altura = 6552 Ancho = 4580 – Ruan