2011-01-31 2 views
5

Я построил сайт сообщества, на котором пользователи загружают свою фотографию, и они могут обрезать миниатюру, ала Facebook, чтобы быть ясной.PHP: Как определить, является ли jpeg полностью черным (без изображения)?

Но по какой-то причине некоторые из них генерируют пустой (фактически черный миниатюрный JPEG).

Я пробовал разные решения, но похоже, что это происходит с большими изображениями или, может быть, на компьютерах, где JS не включен? Я не знаю ...

В нижней строке, так как количество пользователей с этим очень маленькое, я думал о создании патча: обнаружил, когда пользователь генерирует пустой jpeg.Тогда я мог бы предупредить их.

Вы знаете, как это сделать?

ответ

1

Предполагая сво действительное черное изображение вы можете:

длинный путь - пиксель сканирования на пиксель для цвета черного

короткий путь (если его же черное изображение всегда) - сравните файл побайтно (или md5 хэш) для образца черного изображения

+0

Второй вариант не работает. Вам понадобится отдельная копия для каждой комбинации ширины, высоты, степени сжатия, кодека ... – Joe

+0

Я не думаю, что короткий путь будет работать, потому что заголовок ID3 и другие метаданные будут постоянно отличаться друг от друга ... Но я могу быть неправильным –

+0

не будет байт количество/содержание отличается в зависимости от размера файла? – reuscam

3

Я думаю нет более быстрый способ, чем ходьба, хотя каждый пиксель с помощью imagecolorat().

Относительно того, почему это происходит, совместно uld из-за CMYK JPG-файлов, которые GD не может переваривать. Не уверен - вам придется попробовать. Если это причина, вы можете обнаружить CMYK, используя getimagesize() и его информацию channels.

0

Если все черное, размер файла будет низким, так как он сжат. Я знаю, что JPG использует перцептивный, а не RLE, но он все равно будет меньше. Почему бы не запретить JPG до 20k, например? Сделайте несколько примеров, сравните размеры, установите свои пороговые значения.

+0

Это звучит неплохо. Что я хочу загрузить серым туманом? –

+0

Тогда плакат, вероятно, не хочет, чтобы вы на своем сайте в любом случае! – Joe

+0

или голубое небо ...? – zaf

4

Измените его на изображение 1x1 PX. Затем проверьте, является ли один пиксель черным. Не идеально, но если в оригинале имеется значительное количество не черного цвета, то 1px не будет черным. Преимущество в том, что он будет быстрым.

+0

Интересная идея, но я думаю, что она слишком грубая в 1x1. Он должен создавать ложные негативы, например. с шахматной доской или черно-белых геометрических фигур. Но это может работать, скажем, с изображением 10x10 пикселей –

+1

@pekka true, 10x10, вероятно, будет более точным и все еще довольно быстрым.Хороший компромисс. – profitphp

2

Мне нравится этот случайный АЛГОРИТМ,

function check_if_black($src){ 

    $img = imagecreatefromjpeg($src); 
    list($width_orig, $height_orig)=getimagesize($src); 
    for($i=0;$i<20;$i++){ 
     $rand_width=rand (0 , $width_orig); 
     $rand_height=rand (0 , $height_orig); 
     $rgb = imagecolorat($img, $rand_width, $rand_height); 
     if($rgb!=0){ 
      return "not black"; 
     } 
    } 
    return "black"; 
} 

Даже если 80% изображения черного цвета имеет 99% для достижения успеха. вы также можете увеличить цикл за лучший процент.