Как загрузить испорченную картинку через php?

Всем привет! При загрузке именно этого изображения - получаю вот такую ошибку php:
PHP Warning:  imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 34 extraneous bytes before marker 0xd1 in /home/........./SimpleImage.class.php on line 1243
PHP Warning:  imagecreatefromjpeg(): '/tmp/php7ZgA6S' is not a valid JPEG file in /home/......../SimpleImage.class.php on line 1243

На строке 1242-1244 вот этот код:
case 'image/jpeg':
   $this->image = imagecreatefromjpeg($this->filename);
   break;

На сколько я понимаю, картинка испорчена, тому свидетельство зеленая полоса чуть выше нижнего правого угла.
Но как решить эту проблему? Ведь например DLE также выбивает ошибку, что изображение испорчено, а вот тот же fastpic или toster спокойно её загружают...

Саму картинку прикрепляю в архиве https://yadi.sk/d/ycTz4UP_3JdR6V

UPD:
Как решение нашел вот такую настройку ini_set('gd.jpeg_ignore_warning', true);
В таком случае картинка прекрасно залетает и сохраняется, но безопасно ли это? Не залетит ли теперь с изображением какая-нить хрень?
  • Вопрос задан
  • 905 просмотров
Пригласить эксперта
Ответы на вопрос 2
egor_nullptr
@egor_nullptr
Ключевой момент здесь libjpeg: recoverable error, поэтому с изображением можно работать, но warning лучше переделать в exception.
case 'image/jpeg':
   $prev_eh = set_error_handler(function ($no, $str, $file) {
        // GdException где-нибдуь выше определите как class GdException extends RuntimeException {};
        throw new GdException();
    }, E_WARNING);
    try {
        $this->image = imagecreatefromjpeg($this->filename);
    } catch (GdException $e) {
        // обработка битой картинки - например, через GraphicsMagick
    };
    set_error_handler($prev_eh);
    break;

А вообще, рекомендую перейти на GraphicsMagick или ImageMagick.
Ответ написан
Комментировать
XXXXPro
@XXXXPro
Fullstack Web developer
Не очень понятна задача. Если нужно конкретно эту картинку загрузить, то можно открыть ее в каком-то графическом редакторе и сохранить заново (либо сконвертировать в PNG, а потом обратно в JPEG на своем компьютере), а потом загружать.
Если требуется убрать предупреждения при загрузке поврежденных картинок вообще, то нужно поставить @ перед imagecreatefromjpeg.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы