2017-02-12 43 views
0

Я пытаюсь создать изображения из динамических текстовых данных в GD и поместить логотип в верхний угол. Фоновый цвет изображения изменится на основе данных, переданных, поэтому я не могу просто сохранить логотип как изображение без альфа-канала.Загрузите прозрачный png в gd php, но не делайте его прозрачным фоном

Я создаю изображение, залейте его динамическим цветом фона с помощью imagefill(), затем добавьте текст с помощью imagettftext(), а затем загрузите мой логотип. У меня проблема с получением логотипа в изображение без него сохраняя свой цвет фона «прозрачным». Поэтому я бы хотел, чтобы у него был динамический фоновый цвет, установленный с помощью imagefill(). Однако он сохраняет фон прозрачности, в который он был загружен, и таким образом записывает эту часть png как прозрачную. Я попробовал вызывать imagefill() на логотипе после его загрузки (используя тот же rgb, который устанавливает фон целевого изображения), но это ничего не делало.

Ниже мой код:

$background = $_GET['background']; 
$data1 = $_GET['data1']; 
$data2 = $_GET['data2']; 
$r = $_GET['r']; 
$g = $_GET['g']; 
$b = $_GET['b']; 

$png_image = imagecreate(400, 200); 
$gd_text_color = imagecolorallocate($png_image, 255, 255, 255); 
$gd_background_color = imagecolorallocate($png_image, $r, $g, $b); 
imagefill($png_image, 0, 0, $gd_background); 

$text1 = "test test $data1"; 
$text2 = "test test again $data2"; 
$font = 'Lato-regular.ttf'; 
imagettftext($png_image, 18, 0, 20, 20, $gd_text_color, $font, $text1); 
imagettftext($png_image, 18, 0, 20, 50, $gd_text_color, $font, $text2); 

//trying to get this logo and place it in the corner. 
$logo = imagecreatefrompng("images/logo.png"); 
imagecopy($png_image, $logo, 10, 10, 0, 0, 100, 30); 

header('Content-type: image/png'); 
imagepng($png_image, $filename); 
imagedestroy($png_image); 

Вот результат этого кода: http://i.imgur.com/n25h9Js.png А вот то, что изображение выглядит как при загрузке в программу, которая принимает альфа-канал: http://i.imgur.com/3OIRupN.png

ли кто-нибудь знаете, как я достиг бы того, что я пытаюсь?

Спасибо за ваше время.

EDIT

Чтобы попытаться объяснить, что я хочу здесь другое изображение. Главное изображение - это то, что я сейчас получаю, и нижнее изображение - это то, что я хочу. Я просто пытаюсь загрузить прозрачный PNG, который может сидеть на столе разных цветных фонов. Однако я либо получаю это, как показано здесь (прозрачный фон), либо как черный фон (потому что, на мой взгляд, альфа-канал не рассматривается?). Надеюсь это поможет. Изображение: Error on top, mocked up version of how I want it below.

Edit 2

В соответствии с комментарием ниже, я изменил его от ImageCreate() до imagecreatetruecolor(), и теперь он работает отлично! Мне хотелось бы объяснить, почему это разрешило это, если у кого есть время, но пока, спасибо всем, кто прокомментировал или даже потратил ваше время на этот вопрос.

+2

Я не уверен, что вы действительно пытаетесь сделать - хотите ли вы, чтобы окончательное изображение имело какую-либо прозрачность или нет. Однако ваш 'imagecreate()' может вызывать проблемы, поскольку он создает изображение на паллетах - возможно, вам нужно 'imagecreatetruecolour()'. –

+1

imagecreatetruecolor (не британская версия!) –

+0

Я пытаюсь создать изображение, которое не имеет прозрачности, правильно. Я предполагаю, что мое объяснение сбивает с толку, поэтому у меня будет другой ход: фоновый цвет финального изображения будет зависеть от входных данных, поэтому я не могу просто создать «логотип» с тем же фоновым цветом конечного изображения. Поэтому я загружаю его как PNG с прозрачностью. Я надеюсь «поместить» его в верхнем левом углу, чтобы он сидел на столе динамического цвета фона, однако GD делает эту часть изображения прозрачной, чего я не хочу. Я включил скриншот в главном сообщении, показывающий, что у меня есть и что я хочу. – poncho

ответ

0

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

Предлагаю заменить его на imagecreatetruecolor().