Неожиданный результат теста node.js против ASP.NET Core

Я понимаю, что это довольно старый, но я немного по-другому беру на обрезку изображения через GD. Вместо того, чтобы делать только одну сторону за раз - все четыре. В какой-то степени это быстрее и дешевле cpu-wise. Однако, если вы остановите цикл FOR в тот момент, когда вы найдете стороны верхнего и нижнего левого правого угла - это быстрее, чем это.

Итак, сначала есть:

#
#   Do all four sides at once
#
        echo "Finding the top-left-bottom-right edges of the image...please wait.\n";
        $top = 99999;
        $bot = -99999;
        $left = 99999;
        $right = -99999;
        for( $x=$offset; $x<($w-$offset); $x++ ){
            for( $y=$offset; $y<($h-$offset); $y++ ){
                $rgb = imagecolorat( $gd, $x, $y );
                if( $color != $rgb ){
                    $left = ($x < $left) ? $x : $left;
                    $right = ($x > $right) ? $x : $right;
                    $top = ($y < $top) ? $y : $top;
                    $bot = ($y > $bot) ? $y : $bot;
                    }
                }
            }

а затем есть:

#
#   Top
#
            echo "Finding the top of the image\n";
            $top = null;
            for( $y=$offset; $y<($h-$offset); $y++ ){
                for( $x=$offset; $x<($w-$offset); $x++ ){
                    $rgb = imagecolorat( $gd, $x, $y );
                    if( $color != $rgb ){ $top = $y; break; }
                    }

                if( !is_null($top) ){ break; }
                }
#
#   Bottom
#
            echo "Finding the bottom of the image\n";
            $bot = null;
            for( $y=($h-$offset); $y>$offset; $y-- ){
                for( $x=$offset; $x<($w-$offset); $x++ ){
                    $rgb = imagecolorat( $gd, $x, $y );
                    if( $color != $rgb ){ $bot = $y; break; }
                    }

                if( !is_null($bot) ){ break; }
                }
#
#   Left
#
            echo "Finding the left of the image\n";
            $left = null;
            for( $x=$offset; $x<($w-$offset); $x++ ){
                for( $y=$offset; $y<($h-$offset); $y++ ){
                    $rgb = imagecolorat( $gd, $x, $y );
                    if( $color != $rgb ){ $left = $x; break; }
                    }

                if( !is_null($left) ){ break; }
                }
#
#   right
#
            echo "Finding the right of the image\n";
            $right = null;
            for( $x=($w-$offset); $x>$offset; $x-- ){
                for( $y=$offset; $y<($h-$offset); $y++ ){
                    $rgb = imagecolorat( $gd, $x, $y );
                    if( $color != $rgb ){ $right = $x; break; }
                    }

                if( !is_null($right) ){ break; }
                }

В обоих случаях переменная цвета $ содержит первую цветную точку на изображении:

$color = imagecolorat( $gd, 0, 0 );

Это происходит потому, что в изображениях GIF - первая точка в 99% случаев является прозрачным (или фоновым) цветом. Кроме того, смещение $ (для меня) означает, что я знаю, что изображение будет только таким широким и таким высоким. Поэтому, если я нарисую что-то, что составляет максимум 256 на 256, но я помещаю его на фон 1024 x 1024, я могу отбросить часть этого фона и сделать смещение 255, тем самым делая цикл FOR только от 255 до (1024 -255) или 769.

Хорошо - до того, как кто-то спросит - ПОЧЕМУ Я бы сделал такое - потому что некоторые шрифты (например, Bastarda) не имеют в них правильной информации о шрифтах, а выход 256pt буква «z» создает изображение, в котором дно «z» проходит мимо 256 (вплоть до примерно 512), поэтому, чтобы получить весь образ, который вы должны запустить (или закончить) дальше, чем то, что вы думаете шрифт пойдет. Поэтому я разделил разницу и ударил 255 пикселей с обоих концов. Это означало, что Bastarda делает это.

Некоторые дополнительные примечания:

1. Изображения PNG, которые вы можете настроить как изображения GIF, но обычно вам нужно будет указать, что цвет фона будет. 2. Изображения JPEG НЕ разматывают точно так же каждый раз. Поэтому даже сравнение того же изображения, которое вы загрузили дважды, может не работать одинаково и может давать разные размеры. 3. Эти процедуры лучше всего работают на простых черно-белых (или двухцветных) изображениях. Несколько цветов могут отбросить эти процедуры. Особенно, если вы решите использовать допуски. 4. Чтобы использовать допуски, чтобы определить, нашли ли вы край изображения, все, что вам нужно сделать, это предварительно вычислить как высокий, так и низкий допуск (т. Е. Если у вас есть допущение пяти (5) на красном компоненте , то вы можете вычислить допуск как X-5-x-x + 5 или x-2,5-x + 2,5 в зависимости от того, хотите ли вы, чтобы допуск был диапазоном WHOLE или только диапазоном +/-). Вы можете иметь допуск для красных, зеленых, голубых и ALPHA частей цвета или всего цвета. Таким образом, существует несколько разных допусков, которые вы можете вычислить, если хотите, и все они - правильный способ сделать это в зависимости от ваших потребностей.

151
задан user3071284 26 July 2017 в 21:07
поделиться