Определение ширины и высоты файла JPEG

В «Эгее» есть какой-то плавающий баг, из-за которого иногда не заливаются файлы JPEG. Илья, автор «Эгеи», пытался с ним разобраться, но до конца понять проблему не смог.

Пока рабочая теория такая, что функция ПХП getimagesize (она возвращает тип изображения и его высоту с шириной) иногда выдаёт неправильные значения.

Опровергнуть или подтвердить эту теорию не так-то и просто — баг проявляется очень редко, но можно попытаться считывать размеры каким-то другим способом и посмотреть исчезнет проблема или нет.

Вот Илья и попросил написать меня такой код на чистом ПХП. Надеюсь это позволит продвинуться в изучении проблемы — код вошёл в одиннадцатую версию «Эгеи».

Выложу его у себя тоже, чтобы не потерялся, ну и может кому-то ещё пригодится:

function readJPEGWxH(string $filename): array
{
    $file = new SplFileObject($filename);

    if (!$file->flock(LOCK_SH)) {
        throw new RuntimeException('Cannot lock the file');
    }

    if ($file->fread(2) !== "\xFF\xD8") {
        throw new RuntimeException('Unknown format');
    }

    for (;;) {
        $decoded = @unpack('H4segment/nlen', $file->fread(4));

        if ($decoded === false) {
            throw new RuntimeException('Unknown format');
        }

        ['segment' => $segment, 'len' => $len] = $decoded;

        // SOFn (Start Of Frame)?
        if (preg_match('/^ffc[0-3]/', $segment)) {
            $segdata = @unpack('Cbits/nheight/nwidth', $file->fread(5));

            if ($segdata === false) {
                throw new RuntimeException('Unknown format');
            }

            return [$segdata['width'], $segdata['height']];
        }

        // len = full lenght of segment except segment magic code
        if ($file->fseek($len - 2, SEEK_CUR) !== 0) {
            throw new RuntimeException('Cannot find start of frame');
        }
    }
}

5 комментариев

Углеродно-кремниевая сегрегация

Когда-то в Америке висели таблички, запрещающие неграм входить в бары «для белых», а сейчас иллюстраторы используют специальные метки, предписывающие искусственному интеллекту не заходить на их сайты:

<meta name="robots" content="noai, noimageai">

Роботы, конечно, пока не обладают самосознанием и такое ограничение не ранит ничьих чувств, но животных без самосознания всё равно защищают от притеснений. Интересно появятся ли технофилы, которые будут защищать права угнетённых алгоритмов или это пока чересчур? Учитывая современные тенденции, я бы удивился.

Я, конечно, понимаю из какой проблемы родились эти метки — среди биологических иллюстраторов есть мнение, что нейросети, которые обучались на их работах, по сути, воруют их интеллектуальную собственность, так как работы алгоритмов основаны на просмотре готовых работ.

Недовольство, конечно, будет нарастать и эти метки не решение — они мало что дают, разве что сгенерируют какой-то инфоповод, который, возможно, докатится до каких-то нейростартапов, но что это изменит? Как будто бы и без этого есть достаточно статей, которые можно прочитать, чтобы понять, что не всё так буквально — нейросеть не лепит изображения из кусочков чужих картинок, но кто их читает?

Выглядит это как двойные стандарты, так как люди делают то же самое — буквально смотрят целую кучу чужих работ, а потом на их основе выдают что-то своё. Но разница в том, что люди «творчески переосмысливают», что бы это не значило, а алгоритм, — в понимании большинства людей, лепит изображение из частей подсмотренных изображений, как из кирпичиков.

Объяснение того как это работает на самом деле сложнее и, такое ощущение, что большинству недоступно. Простому же объяснению на понятных метафорах ещё предстоит родиться, но не факт, что оно не устареет ко времени своего рождения.

Тем не менее, собака лает, караван идёт, мы считали, что роботы нас освободят от физического труда, а они всё больше начинают освобождать от интеллектуального. Но цепочка от проблемы до результата пока достаточно длинная, чтобы ещё успеть вкусно покушать, сидя на её конце со стороны постановки проблемы.

2 комментария

Титанобоа vs. мегалодон

Загадка про курицу и яйцо для меня вообще не загадка, да и с китом и слоном мне всё досконально ясно. Но есть предел и моим знаниям — он в вопросах шестилетнего ребёнка.

Сегодня дочка огорошила меня новым вызовом: «папочка, а кто победит — титанобоа или мегалодон?», ответа у меня пока нет, буду изучать вопрос.

10 комментариев