Пустое место, заполняемое черным после GD imagecopy, но только в некоторых сценариях

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

Так, например, скажите, что контейнер - 400 x 200, и пользователь хочет быть в состоянии вставить эмблему, которая является 600 x 100, они могут хотеть сократить эмблему, таким образом, это соответствует и пространство отпуска наверху и основание. Я должен быть в состоянии сохранить это как изображение, которое является 400x200 с соответствующими промежутками наверху и основанием.

Что я нашел, хотя то, что, если содержимое изображения (эмблема в этом примере) простирается и вне вершины и вне права на контейнер, все прекрасно ИЛИ если это, который DOESNT расширяют или вне, хорошо, но если это простирается вне одного, а не другой тогда я становлюсь темнокожим, заполняются - или что-то как этот - видит примеры ниже...

Ниже некоторые примеры результатов, и это - код, который я использую...

$cropped =  wp_imagecreatetruecolor( $frame_w, $frame_h);
    $backgroundColor = imagecolorallocatealpha($cropped, 0, 0, 0, 127);
    //imageantialias( $cropped, true );
    //if $img_y or $img_x are negative we need to apply the value to $img_x and $img_y
    //if $img_y or $img_x are positive we need to apply the value to $dest_x and $dest_y
    $dest_x = strstr($img_x,'-') ? 0 : abs($img_x);//if neg is true = 0 else offset inside
    $dest_y = strstr($img_y,'-') ? 0 : abs($img_y);
    $img_x = strstr($img_x,'-') ? abs($img_x) : 0;//if neg is true offset outside else 0
    $img_y = strstr($img_y,'-') ? abs($img_y) : 0;
    $img_w = $img_w > $frame_w ? $frame_w : $img_w;
    $img_h = $img_h > $frame_h ? $frame_h : $img_h;
    imagecopy( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h);
    //imagecopymerge( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h,100);
    //imagecopyresampled( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $frame_w, $frame_h, $img_w, $img_h );
    imagefill($cropped, 0, 0, $backgroundColor);//putting this after the copy makes any black borders transparent again unless $resized does not extend beyond both dimensions

Примеры

Image does not extend beyond top or beyond right (fine) Image does not extend beyond top or beyond right (fine)

Image extends beyond bottom but not right (not fine) Image extends beyond bottom but not right (not fine)

Image extends beyond both (fine) Image extends beyond both (fine)

Image extends beyond right but not bottom (not fine) Image extends beyond right but not bottom (not fine)

Image Extends beyond neither (fine) Image Extends beyond neither (fine)

Я буквально рвал волосы, пытаясь зафиксировать это и попробовал каждую возможную комбинацию imagesavealpha, imagecopymerged, imagecolorallocatealpha, imagealphablending и т.д. я могу думать, но ничто, кажется, не фиксирует это...

Таким образом, действительно ли это - ошибка/ограничение GD? Или может кто-то там приходить к моему спасению!

0
nl ja de
Как разъяснение изображения выше все правильны от высоты и точки зрения содержания, я знаю их don' t взгляд, но пункт того, что я делаю, случается так, что это позволяет uer помещать содержимое изображения везде, где им нравится. Таким образом, у меня нет проблемы с высотой или содержанием, становящимся подрезанным прочь, который является всем штрафом. Проблема просто, что пустое место вокруг содержимого изображения в некоторых сценариях заполнено черным, когда это должно быть прозрачно
добавлено автор David O'Sullivan, источник
то, что 1 пкс граничит вокруг вращаемого содержимого изображения, прослушивает ад из меня также
добавлено автор David O'Sullivan, источник

3 ответы

Я не знаю, поможет ли это вам, но у меня была проблема с этим ранее сегодня. Коробка расширяется, но область была черной. Вот мой код (который меры это):

<?php
function createImage($text)
{
   //Adds an extra space to fill underline
    $text = " $text";
   //Adds one line at the end
    $text .= "\n";
   //Wrap the text to fit the image
    $text = wordwrap($text, 40, "\n");
   //Count new lines
    $newlines = substr_count($text, "\n");
   //Count how long to expand
    if($newlines == 0)
    {
        $height = 30;
    }
    else
    {
        $height = 30*$newlines-$newlines*5;
    }

    putenv('GDFONTPATH=' . realpath('.'));
    header('Content-Type: image/png');
   //Adding underline
    $e = explode('<', $text);
    for($i=0;$i
0
добавлено
Посмотрите переменную $height
добавлено автор William N, источник
Да, к сожалению, я уже назначаю цвет на изображение продукции, но не работают правильно все время все время иногда, его право иногда не - видит выше. Мне нужен он, чтобы быть прозрачным, потому что я не знаю то, чем второстепенный цвет страницы будет - и это - альфа, которая, кажется, проблема...
добавлено автор David O'Sullivan, источник
Также проблема не с самой высотой, изображения выше - весь ' right' высота и ширина (во что, именно это выбрал пользователь) и изображения помещены как отобранный пользователь, ее просто, что иногда дополнительное пространство заполнено черным, когда othertimes код правильно пустое место продукции как прозрачное...
добавлено автор David O'Sullivan, источник

Я не уверен, является ли это фактическим ответом, так как это в основном, 'Используют ImageMagick', но так или иначе для тех, для кого ImageMagick - возможность, код ниже мог бы помочь им достигнуть того же самого, поскольку я пробовал к вышеупомянутому... В основном ImageMagick кажется намного выше GD, никаких границ вокруг вращаемых изображений, никакие стычки с прозрачностью, никакой onwanted черный не заполняется, более четкое изменение размеров, если вы увеличиваетесь...

$img_x = -50; //left offset of the image within the frame
$img_y = 50; //top offset of the image within the frame
$img_w = 400; //width of the image to be put in the frame
$img_h = 200;//height of the image to be put in the frame
$angle = 45; //rotation to be applied to the image before it is put into the frame
$frame_w = 300; //width of the frame the image is going into
$frame_h = 300; //height of the frame the image is going into
$img_path = 'path/to/image/file.jpg';
$image = new Imagick( $img_path );
$size = $image->getImageGeometry();
$orig_w = $size['width']; $orig_h = $size['height'];
$image->scaleImage( $img_w, $img_h );
//rotate if necessary
if($angle)
    {
    $image->rotateImage( new ImagickPixel('none'), $angle );
    $size = $image->getImageGeometry();
    $img_w = $size['width']; $img_h = $size['height'];
    }
//composite into frame
//in imagemagick we create an image that is the size of the frame and make it transparent
$frame = new Imagick();
$frame->newImage($frame_w, $frame_h, new ImagickPixel("none"));
//then we composite the image itself into this with the respective offset values
$frame->compositeImage( $image, Imagick::COMPOSITE_DEFAULT, $img_x, $img_y );
//save it
$destfilename = "{$dir}/{$name}-{$img_suffix}.{$ext}";
$frame->writeImage($destfilename);
$frame->clear();
$frame->destroy();
$image->clear();
$image->destroy();

The above code produces The above code produces this...yay!

0
добавлено

я думаю, что это произойдет только для PNG, сверяются с другими форматами

0
добавлено
Содержание действительного образа на картинах выше начатого как jpg, но я должен использовать png для продукции, потому что мне нужны незаполненные области, чтобы быть прозрачным... Вы знаете, был ли бы imageMagick лучше? Я don' у t есть он на моем сервере, спросил мой хозяин, но жду, чтобы услышать, установят ли они его. Хотел бы знать наверняка, если ImageMagick решит проблему, прежде чем я пройду стычку движущихся серверов и т.д...
добавлено автор David O'Sullivan, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp