2012-01-24 6 views
5

Uso Curl tramite Proxy per scaricare immagini con un raschietto che ho sviluppato.PHP: Determina immagini visivamente corrotte (ancora valide) scaricate tramite Curl con GD/Imagemagick

Purtroppo, si ottiene l'immagine strana che sembra come questi e l'ultimo è completamente vuoto:/

3/4 corrupted dog corrupted room corrupted completely white

  • quando prova le immagini via ImageMagick (usando identifica) mi dice che sono immagini valide.
  • Quando eseguo di nuovo il test delle immagini tramite exif_imagetype() e imagecreatefromjpeg(), entrambe le funzioni indicano che le immagini sono valide.

Qualcuno ha un modo per determinare se l'immagine ha la maggior parte del grigiore o è completamente bianca/bianca e queste sono effettivamente immagini danneggiate?

Ho fatto un sacco di controllo con altre domande qui, ma non ho avuto molta fortuna con altre soluzioni. Quindi, si prega di fare attenzione nel suggerire che questo è un duplicato.

Grazie


Dopo conoscere imgcolorat, ho fatto una ricerca e sono imbattuto in un codice. Mi è venuto in mente questo:

<?php 

$file = dirname(__FILE__) . "/images/1.jpg"; 

$img = imagecreatefromjpeg($file); 

$imagew = imagesx($img); 
$imageh = imagesy($img); 
$xy = array(); 

$last_height = $imageh - 5; 

$foo = array(); 

$x = 0; 
$y = 0; 
for ($x = 0; $x <= $imagew; $x++) 
{ 
    for ($y = $last_height;$y <= $imageh; $y++) 
    { 
     $rgb = @imagecolorat($img, $x, $y); 

     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 

     if ($r != 0) 
     { 
      $foo[] = $r; 
     } 
    } 
} 

$bar = array_count_values($foo); 

$gray = (isset($bar['127']) ? $bar['127'] : 0) + (isset($bar['128']) ? $bar['128'] : 0) + (isset($bar['129']) ? $bar['129'] : 0); 
$total = count($foo); 
$other = $total - $gray; 

if ($gray > $other) 
{ 
    echo "image corrupted \n"; 
} 
else 
{ 
    echo "image not corrupted \n"; 
} 
?> 

Qualcuno vede qualche potenziale insidia con questo? Ho pensato di ottenere le ultime poche righe dell'immagine e quindi di confrontare il totale di r 127,128,129 (che sono grigie) rispetto al totale di altri colori. Se il grigio è maggiore degli altri colori, l'immagine è sicuramente danneggiata.

Opinioni ben accette! :)

+0

Hmm. Se tutte queste funzioni dicono che è un'immagine valida, probabilmente controllano i byte dell'intestazione ma non guardano se l'intero file è effettivamente * lì *. Mi aspetto che ci sia un byte di intestazione che specifica l'atteso con, ma non so con certezza se esista una cosa del genere –

risposta

1

Se l'immagine che viene restituita è un file valido, quindi consiglio di eseguire lo scrape due volte (cioè scaricarlo due volte e controllare se sono uguali).

Un'altra opzione potrebbe essere quella di controllare gli ultimi pixel dell'immagine (cioè l'angolo in basso a destra) per vedere se corrispondono esattamente a quel colore di grigio. Se lo fanno, quindi eseguire nuovamente il download. (ovviamente questo approccio fallisce se scarichi un'immagine che in realtà dovrebbe essere grigia in quell'angolo, con quel colore esatto ... ma se controlli molti degli ultimi pixel dovrebbe ridurne le probabilità ad un livello accettabile).

+0

* Questo secondo approccio presuppone che lo strumento per la raschiatura stia effettivamente compilando l'intera immagine e non solo soffocando la parte -way through, e dandovi un file parziale. – CasualT

+0

Sono tutto per controllare gli ultimi pixel dell'immagine per vedere se è grigio. Solo non so come farlo. Se trovi una soluzione, controlla le immagini fornite. – PaulM

+0

questo dovrebbe fare il trucco: http://php.net/manual/en/function.imagecolorat.php – CasualT

4

trovato questa pagina quando si cerca un modo per controllare immagini visivamente corrotte come questa. Ecco un modo per risolvere il problema utilizzando bash (in ogni caso, la linea di comando di conversione può essere facilmente adattato per PHP o Python):

convert INPUTFILEPATH -gravity SouthWest -crop 20%x1% -format %c -depth 8 histogram:info:- | sed '/^$/d' | sort -V | head -n 1 | grep fractal | wc -l 

Si ritaglia una piccola piazza nell'angolo sud-ovest del quadro, poi ottiene il istogramma di questa immagine. Se il colore principale dell'istogramma ha il nome "frattale" invece di un colore rgb, significa che questa zona è corrotta e quindi l'output sarà 1 e 0 in caso contrario.

Spero che questo aiuti!

+0

Sembra funzionare. Cosa significa effettivamente "frattale" nell'istogramma? – Frans

+0

Fractal è solo il colorname per # 808080. So che questo è vecchio, ma ci siamo imbattuti in un problema in cui la parte inferiore dell'immagine è effettivamente grigio. Sarebbe davvero bello poter specificare quale colore "predefinito" dovrebbe essere lì invece di "frattale", qualche idea? –

2

Io uso questo. Se la maggior parte dei pixel nell'angolo in basso a destra (5x5) è grigia, l'immagine è rotta.

define('MIN_WIDTH',500); 
    define('MIN_HEIGHT',200); 

    function isGoodImage($fn){ 
     list($w,$h)=getimagesize($fn); 
     if($w<MIN_WIDTH || $h<MIN_HEIGHT) return 0; 
     $im=imagecreatefromstring(file_get_contents($fn)); 
     $grey=0; 
     for($i=0;$i<5;++$i){ 
      for($j=0;$j<5;++$j){ 
        $x=$w-5+$i; 
        $y=$h-5+$j; 
        list($r,$g,$b)=array_values(imagecolorsforindex($im,imagecolorat($im,$x,$y))); 
        if($r==$g && $g==$b && $b==128) 
         ++$grey; 
      } 
     } 
     return $grey<12; 
    } 
0

comando di ImageMagick identify individuerà le immagini molto più corrotti se lo si chiama con l'opzione -verbose. E c'è anche l'opzione -regard-warnings, che renderà gli avvertimenti come degli errori. Prova questi contro un'immagine negativa e verifica se il risultato è un codice di errore diverso da zero.