Ho cercato ovunque ma non sembra essere uno standard (ho potuto vedere) di come si farebbe per verificare se un'immagine è vuota. In C#Controllo per vedere se un'immagine è vuota in C#
Ho un modo per farlo, ma mi piacerebbe sapere qual è il modo corretto di controllare per vedere se un'immagine è vuota, così tutti potrebbero anche sapere in futuro.
Non ho intenzione di copiare incolla un po 'di codice, se vuoi, sarà per me un piacere, ma prima voglio solo spiegare come vado a controllare per vedere se un'immagine è vuota.
Prendi un'immagine .jpg, ottieni la larghezza. Ad esempio 500 pixel Poi si dividono che entro 2 dando 250
Poi si controlla ciò che il colore di ogni pixel è nella posizione di (250 di larghezza, ed io altezza) (dove eseguire iterazioni pensato l'altezza del
Ciò che allora fa è solo controllare la linea mediana dei pixel di un'immagine, verticalmente, ma controlla tutti i pixel per vedere se il colore è qualcosa Eccetto il bianco. L'ho fatto così non avrai per cercare TUTTI i 500 * altezza dei pixel e quasi sempre troverai un colore nel mezzo della pagina
Il suo funzionamento ... un po 'lento ... Ci deve essere un modo migliore per farlo? Puoi cambiarlo per cercare le linee 2/3/4 in verticale per aumentare la possibilità di individuare una pagina che non è vuota, ma che richiederà ancora più tempo.
(Si noti inoltre, utilizzando la dimensione dell'immagine per verificare se contiene qualcosa non funziona in questo caso, dal momento che una pagina con due frasi su e le dimensioni di una pagina bianca è troppo vicini l'uno all'altro)
Dopo aver aggiunto la soluzione.
Risorse utili per l'implementazione e la comprensione della soluzione.
- Writing unsafe code - pointers in C
- Using Pointers in C#
- /unsafe (C# Compiler Options)
- Bitmap.LockBits Method (Rectangle, ImageLockMode, PixelFormat)
(Si noti che il primo sito web, il Pizelformat dichiarato è in realtà PixelFormat) - piccolo errore lo so, basta ricordare, potrebbe causare una certa confusione ad alcuni.
Dopo aver implementato il metodo per accelerare la ricerca dei pixel, la velocità non è aumentata di molto. Quindi penso che sto facendo qualcosa di sbagliato.
Vecchio orario = 15,63 per 40 immagini.
nuovo tempo = 15.43 per 40 immagini
ho visto con il grande articolo DocMax quoted, che il codice "blocca" in un insieme di pixel. (o come ho capito) Quindi quello che ho fatto è bloccare la fila centrale di pixel di ogni pagina. Sarebbe la mossa giusta da fare?
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;
}
E allora la classe
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;
}
Hai tempo per quanto tempo ci vuole? Se sì, qual era il tempo e qual era l'altezza dell'immagine? – 3aw5TZetdf
Devi fare qualcosa di sbagliato nella tua implementazione, perché il tuo algoritmo mi sembra corretto. Non dovrebbe impiegare tempo per scansionare una colonna di una bitmap. –
Tempo totale per 32 immagini = 00: 00: 12.9187389 Altezza = 6552 Larghezza = 4580 – Ruan