PHP로 이미지에 오버레이 텍스트

5851 단어 phpprogramming
얼마 전에 누군가 정적 배경 이미지와 이름 목록을 사용하여 졸업장 목록을 만드는 방법을 물었습니다. 문제는 30분 이내에 구현될 수 있을 만큼 간단했기 때문에 한 번 시도해 보기로 결정했고 결과는 다음과 같습니다.

이것은 명령줄에서 직접 실행할 수 있는 몇 가지 가정이 있는 간단한 PHP 스크립트입니다. 워터마크 이미지, 모바일에 최적화된 이미지, Google 스프레드시트 또는 Airtable에서 데이터 읽기 등과 같은 더 복잡한 요구 사항을 충족하도록 쉽게 조정할 수 있으므로 자유롭게 저장소를 포크하거나 소스를 다운로드하고 필요에 따라 해킹하세요. .

아래 코드로 이동합니다.


이것으로부터…
…이에







코드에.

<?php



먼저, 코드에서 이 항목이 설정되는 위치를 파악하지 않고도 스크립트 동작을 조정할 수 있는 몇 가지 변수입니다.

$csv_file = 'names.csv';
$background = 'background.jpg';
$signature = 'sig.png';
$font = 'ConeriaScript.ttf';



그런 다음 CSV 파일을 읽고 구문 분석하여 열 이름을 키로 사용하여 연관 배열로 변환하여 나중에 읽기 쉽도록 합니다.

// CSV code from https://www.php.net/manual/en/function.str-getcsv.php
$csv = array_map('str_getcsv', file($csv_file));
array_walk($csv, function (&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});
array_shift($csv);



이 특정 배경을 위해 세 개의 다른 위치에 배치할 세 개의 문자열로 현재 날짜가 필요합니다.

$day = date('j');
$month = date('F');
$year = date('Y');



이제 우리는 PHP의 이미지 기능을 즐기기 시작합니다. 먼저 배경 이미지를 읽어서 기본 정보를 얻고 텍스트 색상, 이미지 너비(텍스트 중앙 정렬용) 설정, 서명 이미지 및 크기 읽기와 같은 몇 가지 준비 작업을 수행해야 합니다.

$image = imagecreatefromjpeg($background);
$color = imagecolorallocate($image, 0, 0, 0);
$width = imagesx($image);
$signature = imagecreatefrompng($signature);
$signature_width = imagesx($signature);
$signature_height = imagesy($signature);



이제 이미지 데이터가 준비되었으므로 목록의 각 이름을 읽기 시작하여 오버레이된 모든 텍스트로 개별 이미지를 생성할 수 있습니다. 읽기 쉽도록 이름과 이유를 자체 변수에 저장하고 있습니다.

  foreach ($csv as $row) {
    $name = $row['Name'];
    $reason = $row['Reason'];



여기에서 다시 배경 이미지를 읽고 있습니다. 루프의 첫 번째 항목의 경우 위에서 이미 읽었기 때문에 이치에 맞지 않지만 모든 image* 함수가 입력을 변경하므로 이 작업을 수행하지 않으면 목록의 모든 이미지가 종료됩니다. 모든 이전 이미지의 이전 텍스트가 겹쳤습니다. 안좋다. 또한 기본적으로 내 텍스트의 네 모서리 위치인 "묶인 상자"라는 텍스트도 표시됩니다. 이미지의 텍스트를 중앙에 배치할 수 있도록 이 작업을 수행합니다.

    $image = imagecreatefromjpeg($background);
    $name_box = imagettfbbox(40, 0, $font, $name);
    $reason_box = imagettfbbox(40, 0, $font, $reason);



이제 실제로 이미지에 텍스트를 렌더링할 차례입니다. 대상 이미지, 텍스트 크기, 각도, x 및 y 위치, 색상, 글꼴(예, 글꼴을 사용할 수 있습니다!), 마지막으로 실제 텍스트를 포함하여 일부 정보를 PHP에 제공하면 됩니다.

    imagettftext($image, 40, 0, ($width - $name_box[2]) / 2, 635, $color, $font, $name);
    imagettftext($image, 40, 0, ($width - $reason_box[2]) / 2, 790, $color, $font, $reason);
    imagettftext($image, 32, 0, 400, 895, $color, $font, $day);
    imagettftext($image, 32, 0, 600, 895, $color, $font, $month);
    imagettftext($image, 32, 0, 600, 975, $color, $font, $year);



텍스트가 올바르게 오버레이되면 보기 좋게 표시되도록 텍스트 위에 "서명"이미지를 추가해야 하므로 보시다시피 서명 이미지(투명한 PNG 파일)를 위에 복사하도록 PHP에 지시합니다. 위치뿐만 아니라 크기도 제공해야 했습니다.

    imagecopy($image, $signature, 400, 980, 0, 0, $signature_width, $signature_height);



거의 다 왔어! 여기에서는 이름을 제공하여 결과 이미지를 디스크에 저장합니다. 저는 이름을 제공하지 않았습니다. PHP는 콘텐츠를 출력할 것입니다. 대신 올바른 header를 제공하여 다운로드 링크로 사용할 수 있습니다.

    imagejpeg($image, "diplomas/$name.jpg");



나는 내 기억을 어지럽히고 싶지 않기 때문에 일단 이미지가 끝나면 파괴됩니다.

    imagedestroy($image);



그리고 목록의 다음 항목으로 이동합니다!

}




보시다시피 이것은 다양한 목적으로 사용할 수 있는 매우 간단하면서도 강력한 스크립트입니다. 부담 없이 see or fork the full project 이 예에서 사용된 이미지 기능에 대한 링크는 다음과 같습니다.
  • imagecreatefromjpeg
  • imagecolorallocate
  • imagesx
  • imagesy
  • imagecreatefrompng
  • imagecreatefrompng
  • imagettfbbox
  • imagettftext
  • imagecopy
  • imagejpeg
  • imagedestroy



  • 이 게시물을 즐기시고 유용하게 사용하시길 바랍니다!

    PHP

    좋은 웹페이지 즐겨찾기