Создать изображение в PHP, чтобы показать гитарные аккорды - PullRequest
31 голосов
/ 06 ноября 2011

У меня есть сайт, который показывает гитарные аккорды / вкладки в текстовом формате. Вот что я сейчас показываю:

Em:

| | | | | |
| | | | | |
| 2 2 | | |
| | | | | |
| | | | | |

Я узнаю, что GD может создать динамическое изображение для этого. Но я новичок в PHP и понятия не имею, что делать.

Легко ли создать такую ​​вещь в PHP для отображения изображения?

Спасибо

Ответы [ 2 ]

73 голосов
/ 06 ноября 2011

Сначала скачайте шрифт arial и получите это изображение (сохранить как guitar.jpg):

guitar.jpg

и поместите их в ту же папку, что и этот скрипт (например, chords.php):

<?php

  function showChord($chord) {
    $imgfile = "./guitar.jpg";
    $text = ".";
    $font = './arial.ttf';

    $im = imagecreatefromjpeg($imgfile);
    $x = imagesx($im);
    $y = imagesy($im);
    $fontsize = 100;
    $white = imagecolorallocate($im, 0, 0, 0);

    $chords = explode('-', $chord);
    // chords[0] = e1 and chords[5] = e6

    $minimum = min($chords);
    imagettftext($im, 15, 0, 1, 32, $white, $font, $minimum);
    $add = 0;
    if($minimum > 0) {
      $add = 30;  
    }
    // chords positions
    $interval1 = ($chords[0] != 0 ? (25 + $add + (intval($chords[0]) - $minimum) * 30) : 0);
    $interval2 = ($chords[1] != 0 ? (25 + $add + (intval($chords[1]) - $minimum) * 30) : 0);
    $interval3 = ($chords[2] != 0 ? (25 + $add + (intval($chords[2]) - $minimum) * 30) : 0);
    $interval4 = ($chords[3] != 0 ? (25 + $add + (intval($chords[3]) - $minimum) * 30) : 0);
    $interval5 = ($chords[4] != 0 ? (25 + $add + (intval($chords[4]) - $minimum) * 30) : 0);
    $interval6 = ($chords[5] != 0 ? (25 + $add + (intval($chords[5]) - $minimum) * 30) : 0);
    // write to the image
    imagettftext($im, $fontsize, 0, 01, $interval1, $white, $font, $text);
    imagettftext($im, $fontsize, 0, 18, $interval2, $white, $font, $text);
    imagettftext($im, $fontsize, 0, 36, $interval3, $white, $font, $text);
    imagettftext($im, $fontsize, 0, 53, $interval4, $white, $font, $text);
    imagettftext($im, $fontsize, 0, 70, $interval5, $white, $font, $text);
    imagettftext($im, $fontsize, 0, 86, $interval6, $white, $font, $text);
    header("Content-type: image/jpeg");
    imagejpeg($im);
    ImageDestroy($im);
  }

#  $chord = '0-2-2-0-0-0'; //Em
  $chord = '2-4-4-3-2-2'; //F#
  showChord($chord);

Это выдаст что-то вроде F #. 2 в левом верхнем углу означает второй лад :

enter image description here

** примечание: я бы также сохранил образ на диск, чтобы вам не приходилось повторно создавать одну и ту же вкладку. *

5 голосов
/ 13 января 2012

Тони Поттье написал прекрасный класс, чтобы сделать это.http://www.tonypottier.info/

Редактировать: чтобы решить проблему, как указано ниже:

$c = new chord(array('x',13,12,11,12,'x'));
$c->setMarginRight(20);
$c->setStartingFret(10);
$c->draw();

Без двухзначных номеров справа не будет правильно показываться

...