Как вставить подпись в нижней части изображения в php?

Я хочу вставить подпись (сохраненную как файл png) в нижней части буквы (сохраненной как файл jpg) на php-сайте. Я использовал imagecopymerge, но вместо моего запроса он создает черный файл изображения. Я тоже использовал этот код, но никакого результата.

function merge($filename_x, $filename_y, $filename_result) {

    list($width_x, $height_x) = getimagesize($filename_x);
    list($width_y, $height_y) = getimagesize($filename_y);

    $image = imagecreatetruecolor($width_x + $width_y, $height_x);

    $image_x = imagecreatefromjpeg($filename_x);
    $image_y = imagecreatefromgif($filename_y);

    imagecopy($image, $image_x, 0, 20, 30, 50, $width_x, $height_x);
    imagecopy($image, $image_y, $width_x, 0, 10, 0, $width_y, $height_y);

    imagejpeg($image, $filename_result);

    imagedestroy($image);
    imagedestroy($image_x);
    imagedestroy($image_y);
}

merge('myimg.jpeg', 'first.gif', 'merged.jpg');

Ответ 1

Пожалуйста, попробуйте эту функцию, я настроил ваш.

function merge($filename_x, $filename_y, $filename_result) {
    $source = imagecreatefromjpeg($filename_x);
    $tobeMerged = imagecreatefromgif($filename_y);

    //add signature on bottom right
    imagecopymerge($source, $tobeMerged, imagesx($source) - imagesx($tobeMerged), imagesy($source) - imagesy($tobeMerged), 0, 0, imagesx($tobeMerged), imagesy($tobeMerged), 100);
    //save your merged image
    imagejpeg($source, $filename_result);

    //destroy image resources to free memory
    imagedestroy($source);
imagedestroy($tobeMerged);
}
merge('myimg.jpeg', 'first.gif', 'merged.jpg');

Ответ 2

Эта функция работает для меня. Поскольку я не видел ваших изображений, я могу рассказать вам, что я использую для тестирования.

  • bg.jpg = 400X400 jpg
  • fg.gif = 200X200 gif (с прозрачным фоном)

function merge($filename_x, $filename_y, $filename_result) {
  list($width_x, $height_x) = getimagesize($filename_x);
  list($width_y, $height_y) = getimagesize($filename_y);

  $image = imagecreatetruecolor($width_x, $height_x);

  $image_x = imagecreatefromjpeg($filename_x);
  $image_y = imagecreatefromgif($filename_y);

  imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
  imagecopy($image, $image_y, 0, 0, 0, 0, $width_y, $height_y);

  imagejpeg($image, $filename_result);

  imagedestroy($image);
  imagedestroy($image_x);
  imagedestroy($image_y);
}

merge('bg.jpg', 'Untitled.gif', 'merged.jpg');

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

Ответ 3

Можно ли запускать инструменты командной строки (например, через exec)? Если это так, imagemagick инструменты командной строки могут делать практически любые манипуляции с изображениями, которые вам нужны. функция наслаивания звучит так, как вы:

echo exec('composite -geometry  +5+10 image1.jpg image2.png image2.png');

Ответ 4

Ваш gif может иметь цветовую палитру и не является истинным цветным изображением. Если ваша версия php имеет 5+ проверку с помощью imageistruecolor и в случае использования imagepalettetotruecolor.