31 votes

Créer une image en PHP pour montrer les accords de guitare

J'ai un site qui montre les accords / tablatures de guitare au format texte. Voici ce que je suis en train d'afficher:

Em:

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

J'apprends que GD peut créer une image dynamique pour cela. Mais je suis nouveau à PHP et je ne sais pas quoi faire.

Est-ce simple de créer une telle chose en PHP pour afficher une image?

Merci

73voto

Book Of Zeus Points 38130

Tout d'abord télécharger l' arial police et obtenir cette image (enregistrer sous guitar.jpg):

guitar.jpg

et les mettre dans le même dossier que le script (par exemple 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);

Ce sera pour la sortie de quelque chose comme F#. Les 2 en haut à gauche signifie la deuxième frette:

enter image description here

*note: je voudrais également enregistrer l'image sur le disque de sorte que vous n'avez pas à régénérer le même onglet et plus.

5voto

Dirk McQuickly Points 936

Tony Pottier a écrit une belle classe juste pour faire ça. http://www.tonypottier.info/

Edit: pour résoudre le problème mentionné ci-dessous:

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

Sans les nombres de chiffres à double figuré, margin-right ne s'afficheront pas correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X