介绍

这是一个可以绘制吉他和弦的PHP类,或者任何其他的字符串乐器。

它大量使用GD2图像库,以极少的代码行构建良好的弦图。

背景

作为一个ukulele玩家,我( 还有坏吉他手) 大量的网站,展示了像"x23240"或者没有任何描述和弦的吉他和弦的网站。

借助几行 PHP,我想我可以开发一个高度可以定制的类来显示这些和弦。

使用代码

这个类被命名为" chord",可以很容易地使用很少的代码行。 如下所示代码:

<?phpinclude('chord.inc.php');$c = new chord(array('x',3,2,0,1,0)); $c->draw();?>

它将输出一个像这样的PNG文件:

Points of Interest

最重要的是,这个类是高度可以定制的。 使用几个函数调用,你可以设置标题。边距。字体大小。自定义颜色和自定义背景图片。

还增加了对barre和弦的支持。 例如下面的和弦。

。是通过以下方式获得的:

<?phpinclude('chord.inc.php');$c = new chord(array('x','x',0,0,0,8)); $c->setShowZeros(false); $c->setMarginRight(20); $c->setBarreChord(7,3,6); $c->setStartingFret(5); $c->draw();?>

我希望这个类能够在任何设置中工作,但同时让用户更深入地使用这个类。

例如一个有趣的机制是字体。 正如你可以能知道的,使用PHP的to构建了 5个字体,该字体由 1个字体表示,从到 5. 它们是相当丑陋的像素字体,但它们可以在盒子中工作。 为了支持字体和自定义fram字体,人们会上传他们的web server ;setFontxxx方法中有一些小逻辑:

<?phpfunction setFontTitle($v) {  if(is_int($v))  {  //1 to 5 is the correct range for built in fonts if($v> = 1 && $v <= 5)  $this->fontTitle = $v;  else throw new Exception('Built in font must be in 1 to 5 range');  }  else if(is_string($v))  {  $this->fontTitle = $v;  }  else {  throw new Exception  ('Use a TTF file or a number representing a built in font');  } } ?>

使用这个逻辑,你可以做 $c->setFontTitle('arial.ttf'); 或者 $c->setFontTitle(5);。 然后,在绘制时,类调用" imagestring"或者" imagettftext",这些函数是使用内置字体或者TTF字体绘制文本的PHP函数。

有趣的逻辑的其余部分位于类的draw() 方法中。 增加了许多逻辑来支持任意大小的弦。 默认情况下,PNG图片将为 90 x120,但用户可以设置任意大小;最终结果必须一致。

因此,表示 string的圆的大小与微动间隔大小成比例。 因此,如果使用 fancy,则和弦将相应地React:

用户的职责是根据需要调整设置。

这就产生了大量的计算,在绘制任何东西之前。

也就是说,我们需要:

  • 计算字符串数

  • 计算可以用于绘图的真实宽度空间( 无空白)

  • 在每个字符串之间以像素表示空格

  • 计算上符号"o"或者"x的大小"

  • 推断总上边距

  • 如果有标题,则按像素计算文本的大小并将它的添加到总页边距。

  • 推导出可以用于绘图的真实高度( 无边界)

  • 以像素为单位计算每个烦恼的大小

<?php$nbStrings = count($this->data);$realWidth = $this->width - $this->margin['left'] - $this->margin['right'];$stringSpacing = ($realWidth/($nbStrings-1));$upperSymbolSize = intval(round($stringSpacing *  $this->upperSymbolSize)); //space needed to draw the"o" or"x"$totalTopMargin = $this->margin['top'] + $upperSymbolSize;$titleMargin = 0;//if there's a title, compute additional top margin inducedif(!empty($this->title)) {  if(is_int($this->fontTitle))  {  $titleMargin = imagefontheight($this->fontTitle);  }  else {  $box = imagettfbboxextended($this->fontTitleSize,  0, $this->fontTitle, $this->title);  $titleMargin = $box['height'];  } }$totalTopMargin += $titleMargin;$realHeight = $this->height - $totalTopMargin - $this->margin['bottom'];$fretsSpacing = $realHeight/($this->maxFrets);?>

当我们拥有所有这些值时,剩下的代码就是一个 Cake: 绘制网格;绘制他们需要的东西,这就是它 !


分类: 程序开发 /

网友品论

留下您的评论