image — Невозможно обрезать / обрезать пробелы из PNG в переполнении стека

Я искал (и пытался) по-разному обрезать или обрезать пробелы из 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 содержат много пустого пространства вокруг подписи, которое мне нужно обрезать.

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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector