Невозможно обрезать / обрезать пробелы из PNG в PHP - PullRequest
0 голосов
/ 08 ноября 2018

Я искал (и пробовал) разные способы обрезать или обрезать пробелы из PNG-изображения с использованием PHP 5.6:

Обрезать пробелы на изображении в PHP

https://gist.github.com/ericpedia/3583170

http://php.net/manual/en/function.imagecropauto.php

https://deano.me/2015/01/trim-an-image-using-php-gd/

Я также читал о Imagick , но загрузка содержит много исходных файлов, и я боюсь, что это может быть неудобно для установки и запуска локально и на моем сервере. В любом случае, я не хочу такую ​​тяжелую библиотеку, которая делает в 100 раз больше, чем мне нужно - я просто хочу обрезать пробелы, вот и все.

Вот что я пробовал:

function CropPNG($img){
    //find the size of the borders
    $b_top = 0;
    $b_btm = 0;
    $b_lft = 0;
    $b_rt = 0;

    //top
    for(; $b_top < imagesy($img); ++$b_top) {
      for($x = 0; $x < imagesx($img); ++$x) {
        if(imagecolorat($img, $x, $b_top) != 0xFFFFFF) {
           break 2; //out of the 'top' loop
        }
      }
    }

    //bottom
    for(; $b_btm < imagesy($img); ++$b_btm) {
      for($x = 0; $x < imagesx($img); ++$x) {
        if(imagecolorat($img, $x, imagesy($img) - $b_btm-1) != 0xFFFFFF) {
           break 2; //out of the 'bottom' loop
        }
      }
    }

    //left
    for(; $b_lft < imagesx($img); ++$b_lft) {
      for($y = 0; $y < imagesy($img); ++$y) {
        if(imagecolorat($img, $b_lft, $y) != 0xFFFFFF) {
           break 2; //out of the 'left' loop
        }
      }
    }

    //right
    for(; $b_rt < imagesx($img); ++$b_rt) {
      for($y = 0; $y < imagesy($img); ++$y) {
        if(imagecolorat($img, imagesx($img) - $b_rt-1, $y) != 0xFFFFFF) {
           break 2; //out of the 'right' loop
        }
      }
    }

    $newimg = imagecreatetruecolor(imagesx($img)-($b_lft+$b_rt), imagesy($img)-($b_top+$b_btm));

    imagecopy($newimg, $img, 0, 0, $b_lft, $b_top, imagesx($newimg), imagesy($newimg));

    imagepng($newimg);
    return $newimg;
}

function imagetrim($im, $bgcol, $pad=null){
    // Calculate padding for each side.
    if (isset($pad)){
        $pada = explode(' ', $pad);
        if (isset($pada[3])){
            $p = array((int) $pada[0], (int) $pada[1], (int) $pada[2], (int) $pada[3]);
        }else if (isset($pada[2])){
            $p = array((int) $pada[0], (int) $pada[1], (int) $pada[2], (int) $pada[1]);
        }else if (isset($pada[1])){
            $p = array((int) $pada[0], (int) $pada[1], (int) $pada[0], (int) $pada[1]);
        }else{
            $p = array_fill(0, 4, (int) $pada[0]);
        }
    }else{
        $p = array_fill(0, 4, 0);
    }

    // Get the width and height of the image.
    $imw = imagesx($im);
    $imh = imagesy($im);

    // Set the X variables.
    $xmin = $imw;
    $xmax = 0;

    // find the endges.
    for ($iy=0; $iy<$imh; $iy++) {
        $first = true;
        for ($ix=0; $ix<$imw; $ix++) {
            $ndx = imagecolorat($im, $ix, $iy);
            if ($ndx != $bgcol) {
                if ($xmin > $ix) { $xmin = $ix; }
                if ($xmax < $ix) { $xmax = $ix; }
                if (!isset($ymin)) { $ymin = $iy; }
                $ymax = $iy;
                if ($first) { $ix = $xmax; $first = false; }
            }
        }
    }

    // The new width and height of the image. (not including padding)
    $imw = 1+$xmax-$xmin; // Image width in pixels
    $imh = 1+$ymax-$ymin; // Image height in pixels

    // Make another image to place the trimmed version in.
    $im2 = imagecreatetruecolor($imw+$p[1]+$p[3], $imh+$p[0]+$p[2]);

    // Make the background of the new image the same as the background of the old one.
    $bgcol2 = imagecolorallocate($im2, ($bgcol >> 16) & 0xFF, ($bgcol >> 8) & 0xFF, $bgcol & 0xFF);
    imagefill($im2, 0, 0, $bgcol2);

    // Copy it over to the new image.
    imagecopy($im2, $im, $p[3], $p[0], $xmin, $ymin, $imw, $imh);

    // To finish up, return the new image.
    return $im2;
}

function ConvertBase64ImageDataToPNG($imgData, $path){
    $image_parts = explode(";base64,", $imgData);
    $image_type_aux = explode("image/", $image_parts[0]);
    $image_type = $image_type_aux[1];
    $img = base64_decode($image_parts[1]);

    //$img = CropPNG($img);
    //$img = imagecropauto($img, IMG_CROP_DEFAULT);
    //$img = imagetrim($img, imagecolorallocate($img, 0xFF, 0xFF, 0xFF), 1);

    file_put_contents($path, $img);
}

Обратите внимание на мою последнюю функцию ConvertBase64ImageDataToPNG() - она ​​отлично работает, она просто не обрезает / обрезает. 3 закомментированные строки - это то, что я пробовал обрезать, и ни одна из них не работает. Я получаю файл PNG, записанный на диск, но он поврежден и не отображается. В случае CropPNG(), который я получил отсюда , я думаю, что мои последние 2 строки неверны. Я изменил, потому что он сказал, чтобы использовать header(), который необходим только при потоковой передаче PNG в браузер, я верю, а я нет - я просто хочу записать его на диск.

Мне не нужно ничего необычного, экзотического или гибкого - я просто хочу, чтобы простой метод вырезал пробелы из файлов подписи PNG (рукописный текст), которые будут загружены в мое веб-приложение PHP. Часто эти файлы подписи PNG содержат много пустого пространства вокруг подписи, которое мне нужно обрезать.

Заранее спасибо за любую помощь.

...