介绍
这是一个可以绘制吉他和弦的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: 绘制网格;绘制他们需要的东西,这就是它 !
分类: 程序开发 /
网友品论
留下您的评论