2012-01-24 33 views
5

Tôi đang sử dụng Curl qua Proxy để tải xuống hình ảnh bằng một scraper mà tôi đã phát triển.PHP: Xác định hình ảnh bị hỏng hình ảnh (chưa hợp lệ) được tải xuống qua Curl với GD/Imagemagick

Thật không may, nó được hình ảnh kỳ lạ trông giống như những điều này và người cuối cùng là hoàn toàn trống:/

3/4 corrupted dog corrupted room corrupted completely white

  • Khi tôi thử nghiệm những hình ảnh qua ImageMagick (sử dụng xác định) nó cho tôi biết chúng là những hình ảnh hợp lệ.
  • Khi tôi kiểm tra lại hình ảnh qua exif_imagetype() và imagecreatefromjpeg(), cả hai chức năng này đều cho tôi biết hình ảnh hợp lệ.

Có ai có cách xác định xem hình ảnh có phần lớn màu xám hoặc hoàn toàn trống/trắng và đây thực sự là hình ảnh bị hỏng không?

Tôi đã thực hiện rất nhiều kiểm tra với các câu hỏi khác ở đây, nhưng tôi đã không có nhiều may mắn với các giải pháp khác. Vì vậy, hãy cẩn thận khi đề xuất đây là bản sao.

Cảm ơn


Sau khi biết về imgcolorat, tôi đã tìm kiếm và vấp vào một số mã. Tôi đã đưa ra điều này:

<?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"; 
} 
?> 

Bất cứ ai cũng thấy một số cạm bẫy tiềm năng với điều này? Tôi nghĩ về việc nhận được một vài hàng cuối cùng của hình ảnh và sau đó so sánh tổng số 127,128,129 r (màu xám) so với tổng số các màu khác. Nếu màu xám lớn hơn các màu khác thì hình ảnh chắc chắn bị hỏng.

Ý kiến ​​được chào đón! :)

+0

Hmm. Nếu tất cả các hàm đó nói đó là một hình ảnh hợp lệ, chúng có thể chỉ kiểm tra các byte tiêu đề nhưng không nhìn xem toàn bộ tệp có thực sự là * có * hay không. Tôi mong đợi có một byte tiêu đề xác định dự kiến ​​với, nhưng tôi không biết chắc chắn liệu một điều như vậy có tồn tại không? –

Trả lời

1

Nếu hình ảnh đang quay trở lại là tệp hợp lệ, tôi khuyên bạn nên chạy hai lần (ví dụ: tải xuống hai lần và kiểm tra xem chúng có giống nhau không).

Một tùy chọn khác là kiểm tra vài pixel cuối cùng của hình ảnh (ví dụ: góc dưới cùng bên phải) để xem chúng có khớp với màu xám chính xác không. Nếu có, hãy tải xuống lại. (rõ ràng cách tiếp cận này không thành công nếu bạn tải xuống một hình ảnh thực sự được cho là màu xám ở góc đó, trong màu chính xác đó ... nhưng nếu bạn kiểm tra một số pixel cuối cùng thì nó sẽ giảm cơ hội ở mức chấp nhận được).

+0

* Cách tiếp cận thứ hai này giả định rằng công cụ cạo của bạn thực sự hoàn toàn phổ biến toàn bộ hình ảnh và không chỉ là phần nghẹt thở - thông qua và cung cấp cho bạn một phần tệp. – CasualT

+0

Tôi là tất cả để kiểm tra vài điểm ảnh cuối cùng của hình ảnh để xem nó có màu xám hay không. Tôi chỉ không biết làm thế nào để làm điều này. Nếu bạn tìm ra giải pháp, vui lòng kiểm tra lại các hình ảnh được cung cấp. – PaulM

+0

điều này nên làm các thủ thuật: http://php.net/manual/en/function.imagecolorat.php – CasualT

4

tìm thấy trang này khi tìm cách kiểm tra hình ảnh bị hỏng hình ảnh như thế này. Dưới đây là một cách để giải quyết vấn đề sử dụng bash (dù sao, dòng lệnh chuyển đổi có thể dễ dàng thích nghi cho php hoặc 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 

Nó Cây một chút vuông ở góc tây nam của bức tranh, sau đó nhận được biểu đồ của hình ảnh này. Nếu màu chính của biểu đồ có tên "fractal" thay vì màu rgb, điều đó có nghĩa là vùng này bị hỏng và do đó đầu ra sẽ là 10 nếu không.

Hy vọng điều này sẽ hữu ích!

+0

Dường như hoạt động. 'Fractal' thực sự có ý nghĩa gì trong biểu đồ? – Frans

+0

Fractal chỉ là colorname cho # 808080. Tôi biết điều này là cũ, nhưng chúng tôi vừa gặp sự cố trong đó phần dưới cùng của hình ảnh thực sự có màu xám. Nó sẽ được thực sự tốt đẹp để có thể xác định những gì "mặc định" màu sắc nên có thay vì "fractal", bất kỳ ý tưởng? –

2

Tôi sử dụng cái này. Nếu phần lớn pixel ở góc dưới cùng bên phải (5x5) có màu xám thì ảnh sẽ bị hỏng.

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

lệnh ImageMagick của identify sẽ xác định hình ảnh xa bị hỏng hơn nếu bạn gọi nó với các tùy chọn -verbose. Và cũng có tùy chọn -regard-warnings, điều này sẽ làm cho nó coi cảnh báo là lỗi. Hãy thử những hình ảnh này chống lại một hình ảnh xấu và xem kết quả có phải là một mã lỗi khác không.

Các vấn đề liên quan