<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php技術者認定試験</title>
	<atom:link href="https://nabeshiblog.com/tag/php%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93/feed/" rel="self" type="application/rss+xml" />
	<link>https://nabeshiblog.com</link>
	<description></description>
	<lastBuildDate>Mon, 18 Apr 2022 07:58:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://nabeshiblog.com/wp-content/uploads/2022/04/cropped-アイコン-32x32.png</url>
	<title>php技術者認定試験</title>
	<link>https://nabeshiblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>遅延的束縛完全理解した</title>
		<link>https://nabeshiblog.com/late-static-bind/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Sat, 13 Nov 2021 06:12:40 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=295</guid>

					<description><![CDATA[PHP技術者認定試験の勉強で遅延的束縛(Late Static Bind)について調べて完全に理解したので、備忘録として残しておきます！ 目次 遅延的束縛とは遅延的束縛をもっと詳しく非転送コール転送コール非転送コールと転 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHP技術者認定試験の勉強で遅延的束縛(Late Static Bind)について調べて完全に理解したので、備忘録として残しておきます！</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">遅延的束縛とは</a></li><li><a href="#toc2" tabindex="0">遅延的束縛をもっと詳しく</a><ul><li><a href="#toc3" tabindex="0">非転送コール</a></li><li><a href="#toc4" tabindex="0">転送コール</a></li><li><a href="#toc5" tabindex="0">非転送コールと転送コールを使った例</a></li></ul></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">遅延的束縛とは</span></h2>



<p>PHP5.3.0から導入された遅延的束縛(Late Static Binding)は簡単にいうと、呼び出すまで実行結果がわからないというものです。</p>



<p>まずは実行前から結果が固定されているパターンから見ていきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>&lt;?php
class A
{
  public static function who()
  {
    echo __CLASS__;
  }
  public static function test()
  {
    self::who();
  }
}

class B extends A
{
  public static function who()
  {
    echo __CLASS__;
  }
}

A::test();
B::test();</code></pre></div>



<p>このコードの10行目に記述されている<strong>self</strong>は呼び出し元に関係なく、selfが記述されたクラス内の静的メソッドを呼び出します。<br>なので、Aを継承しているBからtestメソッドを呼び出しても必ずAクラス内のwho()メソッドが呼び出されてAという結果が出力されます。</p>



<p>次は遅延的束縛を利用したパターンです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>&lt;?php
class A
{
  public static function who()
  {
    echo __CLASS__;
  }
  public static function test()
  {
    static::who();
  }
}

class B extends A
{
  public static function who()
  {
    echo __CLASS__;
  }
}

A::test();
B::test();</code></pre></div>



<p>selfと記述されたいた箇所をstaticに変更しただけで他は同じです。<br><strong>static</strong>は呼び出し元クラスを参照するので、B::test()を呼び出した時のtestメソッド内の処理はB::who()と同じ意味となり、Bと出力します。</p>



<p>このように、呼び出してからstaticの参照先が決まるので遅延的束縛と呼ばれます。</p>



<h2 class="wp-block-heading"><span id="toc2">遅延的束縛をもっと詳しく</span></h2>



<p>冒頭で分かりやすくするためにざっくりと紹介しましたが、遅延的束縛を詳しく説明すると、非転送コール時に明示された<strong>クラス名</strong>を保持する機能と言えます。</p>



<p>まずは非転送コールと転送コールの違いを理解しておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">非転送コール</span></h3>



<p>X::foo()や$x-&gt;foo()といったクラス名やオブジェクトを明示的に指定した呼び出し</p>



<h3 class="wp-block-heading"><span id="toc4">転送コール</span></h3>



<p>self::, parent::, static::のこと</p>



<h3 class="wp-block-heading"><span id="toc5">非転送コールと転送コールを使った例</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>&lt;?php
class A
{
  public static function foo()
  {
    static::who();
  }

  public static function who()
  {
    echo __CLASS__ . &quot;\n&quot;;
  }
}

class B extends A
{
  public static function test()
  {
    A::foo();
    parent::foo();
    self::foo();
  }

  public static function who()
  {
    echo __CLASS__ . &quot;\n&quot;;
  }
}
class C extends B
{
  public static function who()
  {
    echo __CLASS__ . &quot;\n&quot;;
  }
}

C::test();</code></pre></div>



<p>Cクラスのtest()メソッドを呼び出すことで、<br><br>A::foo() 転送コール<br>parent::foo() 非転送コール<br>self::foo() 非転送コール<br><br>が実行されます。</p>



<p>C::test()は非転送コールでA::foo()も非転送コール。<br>Aクラス内のwho()メソッドのstaticは直近の非転送コールのクラス名を保持しているためAを指し、A::whoを呼び出すことになり、Aを出力する。</p>



<p>parent::foo()は転送コールなので直近の非転送コールのクラス名を保持します。<br>つまり、foo()メソッド内でC::who()が実行され、Cが出力される。</p>



<p>self::foo()も転送コールなので直近の非転送コールを保持し、foo()メソッド内でC::who()が呼び出されることになり、Cが出力される。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPでPDFを出力する方法</title>
		<link>https://nabeshiblog.com/php-pdf/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Fri, 08 Oct 2021 13:25:50 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=157</guid>

					<description><![CDATA[今回はPHPのスクリプトからPDFを出力する方法を解説します。ただ、かなり古い書き方です。。PHP5技術者認定試験上級を受験される方にとっては有益な情報になると思うので最後まで目を通してください！ 目次 PDFライブラリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回はPHPのスクリプトからPDFを出力する方法を解説します。<br>ただ、かなり古い書き方です。。<br>PHP5技術者認定試験上級を受験される方にとっては有益な情報になると思うので最後まで目を通してください！</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">PDFライブラリ</a></li><li><a href="#toc2" tabindex="0">基本操作</a></li><li><a href="#toc3" tabindex="0">コンストラクタで設定できる値</a></li><li><a href="#toc4" tabindex="0">テキストの色を変更する</a></li><li><a href="#toc5" tabindex="0">セル関連のメソッド</a></li><li><a href="#toc6" tabindex="0">ページ関連のメソッド</a></li><li><a href="#toc7" tabindex="0">画像</a></li><li><a href="#toc8" tabindex="0">リンク</a></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">PDFライブラリ</span></h2>



<p>PHPでPDFを出力するライブラリはいくつかあります。<br>有名なところでいうと、<strong>FPDF</strong>、<strong>MBFPDF</strong>、<strong>TCPDF</strong>があります。</p>



<p>これらのライブラリはネット上からダウンロードしてスクリプトにインクルードするだけで使用できる優れものです。<br>リンクを貼っておくのでダウンロードして使ってみてください。<br><strong><a href="http://www.fpdf.org/">FPDF</a></strong>、<strong><a href="https://tcpdf.org/">TCPDF</a></strong><br><strong>MBFPDF</strong>はもう配布されていないのかもしれません。。</p>



<p>FPDFとMBFPDFの使い方は同じだと思って構いません。<br>しかし、日本語のようなマルチバイトの文字をPDFに出力したい場合はMBFPDFを使用してください。</p>



<p>TCPDFはUTF-8での多言語出力に優れていて、PDFをHTMLのタグを使用して記述できます。</p>



<p>試験ではMBFPDFの使い方を問われるようなので、MBFPDFに焦点を当てて解説します。</p>



<h2 class="wp-block-heading"><span id="toc2">基本操作</span></h2>



<p>MBFPDFライブラリを使用するにはまず、mbfpdf.phpをインクルードする必要があります。<br>インクルードしてMBFPDFクラスをインスタンス化すればMBFPDFをすぐに使用できる状態になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();</code></pre></div>



<p>次に使用するフォントを登録します。<br>登録するには<strong>AddMBFontメソッド</strong>を使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>AddMBFont(family, encode);</code></pre></div>



<p>第一引数にはフォントを使用するフォントを指定します。<br>MBFPDFライブラリでは日本語用のフォントが用意されています。<br>以下、用意されているフォントです。<br>(KOZMIN、GOTHIC、PGOTHIC、UIGOTHIC、MINCHO、PMINCHO)</p>



<p>第二引数は文字コードを指定します。<br>指定できる文字コードはSJIS、EUC_JPのみです。<br><strong>UTF-8は指定できません。</strong></p>



<p>第三引数にフォント定義ファイルまでのパスを指定することでそのフォントをスクリプト内で使用することができます。<br>しかし、環境によって日本語が正しく表示されない場合もあるので注意が必要です。</p>



<p>複数フォントを使用したい場合は、その数だけAddMBFontメソッドを呼び出してください。</p>



<p>使用するフォントをGOTHIC、文字コードをSJISにした場合は以下のようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="5"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);</code></pre></div>



<p>これでGOTHICを使用できるようになりました。</p>



<p>次は新規ページを追加するために<strong>AddPageメソッド</strong>を使用します。<br>このメソッドは引数を取りません。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="7"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();</code></pre></div>



<p>これで新規ページ（1ページ目）が追加されました。</p>



<p>PDFの出力の際に使用するフォントを設定するには<strong>SetFontメソッド</strong>を使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>SetFont(font, style, size);</code></pre></div>



<p>第一引数にはSetMBFontメソッドで登録したフォントを指定してください。</p>



<p>第二引数のstyleは<strong>B（bold: 太字）</strong>、<strong>I（italic: 斜体）</strong>、<strong>U（underline: 下線）</strong>のいずれかを指定します。</p>



<p>第三引数はフォントサイズを指定します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="9"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();

$pdf-&gt;SetFont(GOTHIC, &#39;B&#39;, 20);</code></pre></div>



<p>出力に使用するフォントが指定できました。</p>



<p>テキストを出力する方法はいくつかありますが、セルを使用する方法を紹介します。</p>



<p><strong>Cellメソッド</strong>は指定した範囲の矩形の中にテキストを出力してくれます。<br>部分的に境界線をつけたり、そもそも境界線をつけないことも可能です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>Cell(width, height, text, border, ln, align);</code></pre></div>



<p>第四引数のboderに0を渡すと境界線なし、1を渡すと境界線ありになります。<br>デフォルトは0です。<br>また、キーワードで指定することも可能です。<br>T（top: 上）、R（right: 右）、B（bottom: 下）、L（left: 左）<br>例えば、左と上だけに境界線を引きたい場合はborderに&#8217;LT&#8217;を渡してください。</p>



<p>第五引数は次のセルの位置をどうするのかを決めます。<br>lnに1を渡すと次のセルは右に配置されるのではなく次の行に移ります。<br>2を渡すと次のセルは下に配置されます。<br>デフォルトの0は次のセルが右に配置されます。</p>



<p>第六引数のalignはテキストの位置を決めます。<br>デフォルトはLでテキストが左端に表示されます。<br>Cを渡すとセルの中央にテキストが表示されます。<br>Rはテキストが右端に表示されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="11"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();

$pdf-&gt;SetFont(GOTHIC, &#39;B&#39;, 20);

$pdf-&gt;Cell(50, 20, &#39;Hello World&#39;) ;</code></pre></div>



<p>幅50、高さ20の境界線のないセルにHello Worldというテキストを出力する準備ができました。</p>



<p>最後に出力する作業が必要です。<br>出力は<strong>Outputメソッド</strong>を呼び出すだけでOKです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="13"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();

$pdf-&gt;SetFont(GOTHIC, &#39;B&#39;, 20);

$pdf-&gt;Cell(50, 20, &#39;Hello World&#39;) ;

$pdf-&gt;Output();</code></pre></div>



<p>ブラウザ上にPDFが出力されていれば成功です。</p>



<p><strong>Lnメソッド</strong>を使用すれば縦のセルの間隔を広げることができます。<br>また、このメソッドに引数を渡さず使用すると次のセルが改行して表示されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="13"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();

$pdf-&gt;SetFont(GOTHIC, &#39;B&#39;, 20);

$pdf-&gt;Cell(50, 20, &#39;Hello World&#39;) ;

$pdf-&gt;Ln(5.5);

$pdf-&gt;Cell(50, 20, &#39;Hello PDF&#39;);

$pdf-&gt;Output();</code></pre></div>



<p>Hello WorldのセルとHello PDFのセルの縦の間隔は5.5ptになります。<br>このように空のセルを作ることなくセルの縦の間隔を広げることができました。</p>



<h2 class="wp-block-heading"><span id="toc3">コンストラクタで設定できる値</span></h2>



<p>MBFPDFのコンストラクタではPDFの<strong>用紙の方向</strong>、<strong>座標の単位</strong>、<strong>ページのサイズ</strong>の3つを指定することができます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf = new MBFPDF(orientation, unit, size);</code></pre></div>



<p>orientationは用紙の方向を指定します。<br>受け取る値はPかLだけです。<br>デフォルトはPで縦ですが、Lを渡すと横になります。</p>



<p>unitは座標の単位を指定します。<br>受け取る値はpt、in、mm、cmのいずれか一つです。<br>デフォルトはptになっています。</p>



<p>sizeはページのサイズを指定します。<br>受け取る値は、Letter、Legal、A5、A3、A4です。<br>デフォルトはLetterになっています。</p>



<p>A4の横向きのPDFを作成する場合は以下のようなコードになります。(単位はpt)</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf = new MBFPDF(&#39;L&#39;, &#39;pt&#39;, &#39;A4&#39;);</code></pre></div>



<p>コンストラクタで指定した座標の単位がCellメソッドやLnメソッドの単位としても使用されます。</p>



<h2 class="wp-block-heading"><span id="toc4">テキストの色を変更する</span></h2>



<p>テキストの色を変更するには<strong>SetTextColorメソッド</strong>を使用します。<br>このメソッドは必ず、Cellメソッドの前に呼び出してください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;SetTextColor(red, green, blue);</code></pre></div>



<p>引数にはそれぞれ0~255の値を渡します。<br>第一引数のみ値を渡した場合は、その値が第二引数と第三引数にも適用されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP" data-line="11,15"><code>require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddMBFont(GOTHIC, &#39;SJIS&#39;);

$pdf-&gt;AddPage();

$pdf-&gt;SetFont(GOTHIC, &#39;B&#39;, 20);

$pdf-&gt;SetTextColor(255, 0, 0);
$pdf-&gt;Cell(50, 20, &#39;Hello World&#39;) ;
$pdf-&gt;Ln();

$pdf-&gt;SetTextColor(0);
$pdf-&gt;Cell(50, 20, &#39;Hello PDF&#39;);

$pdf-&gt;Output();</code></pre></div>



<h2 class="wp-block-heading"><span id="toc5">セル関連のメソッド</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;SetDrawColor(red, green, blue);</code></pre></div>



<p>セルの境界線の色を指定します。<br>第二引数、第三引数を省略すると第一引数の値がそれぞれ渡されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;SetFillColor(red, green, blue);</code></pre></div>



<p>セルの背景色を指定します。<br>第二引数、第三引数を省略した場合の処理は同じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;SetLineWidth(width);</code></pre></div>



<p>セルの境界線の太さを指定します。</p>



<h2 class="wp-block-heading"><span id="toc6">ページ関連のメソッド</span></h2>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;PageNo();</code></pre></div>



<p>現在のページ番号を返します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;AliasNbPages()</code></pre></div>



<p>このメソッドを実行するとnbという変数が定義され、その変数の中にそうページ数が代入される。</p>



<h2 class="wp-block-heading"><span id="toc7">画像</span></h2>



<p>MBFPDFライブラリで作成するPDF内に画像を挿入する場合は<strong>Imageメソッド</strong>を使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$pdf-&gt;Image(name, x, y, width, height);</code></pre></div>



<p>表示したい画像の位置をxとyに、サイズをそれぞれwidthとheightに渡してください。<br>widthとheightを省略した場合、MBFPDFが最適な大きさで画像を表示してくれます。</p>



<h2 class="wp-block-heading"><span id="toc8">リンク</span></h2>



<p>MBFPDFは2種類のリンクを作成できます。<br>1つ目は同じドキュメント内のページを跨ぐ内部リンク、2つ目は外部リンクです。</p>



<p>内部リンクを作成するには起点と終点が必要です。<br>起点を指定するには<strong>AddLinkメソッド</strong>、終点を指定するには<strong>SetLinkメソッド</strong>を使用します。<br>AddLinkメソッドの返り値をImageメソッド、Cellメソッド、Writeメソッドのいずれかの引数に渡すことでクリックすることができる画像もしくはテキストを生成できます。<br>SetLinkメソッドの引数には同じようにAddLinkメソッドの返り値を渡します。<br>これで内部リンクの完成です。</p>



<p>Imageメソッド、Cellメソッド、Writeメソッドそれぞれを使用したリンクの生成方法を順に記述しておくので確認しておいてください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// Imageメソッドを使用する場合
require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddPage();

$link = $pdf-&gt;AddLink();
$pdf-&gt;Image(&quot;php.png&quot;, 0, 0, 256, 135, &quot;PNG&quot;, $link); 

$pdf-&gt;AddPage();

$pdf-&gt;SetLink($link);</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// Cellメソッドを使用する場合
require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddPage();

$link = $pdf-&gt;AddLink();
$pdf-&gt;Cell(50, 10, &#39;ここ&#39;, 0, 0, &#39;L&#39;, false, $link);

$pdf-&gt;AddPage();

$pdf-&gt;SetLink($link);</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// Writeメソッドを使用する場合
require(&#39;./mbfpdf.php&#39;);

$pdf = new MBFPDF();

$pdf-&gt;AddPage();

$link = $pdf-&gt;AddLink();
$pdf-&gt;Write(5, &quot;ここ&quot;, $link);

$pdf-&gt;AddPage();

$pdf-&gt;SetLink($link);</code></pre></div>



<p>外部リンクはAddLinkメソッドとSetLinkメソッドを使用する必要はなく、Imageメソッド、Cellメソッド、Writeメソッドにリンクを渡すだけ大丈夫です。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP グラフィック処理 ~画像の拡大縮小~</title>
		<link>https://nabeshiblog.com/php-graphic4/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Wed, 06 Oct 2021 09:27:11 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=124</guid>

					<description><![CDATA[今回は画像のサイズの変更方法について解説していきます。画像のサイズの変更方法は２通りあります。1つ目はimagecopyresized関数を使用する方法。2つ目はimagecopyresampled関数を使用する方法です [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回は画像のサイズの変更方法について解説していきます。<br>画像のサイズの変更方法は２通りあります。<br>1つ目は<strong>imagecopyresized関数</strong>を使用する方法。<br>2つ目は<strong>imagecopyresampled関数</strong>を使用する方法です。<br>それぞれ特徴があるのでその特徴をしっかり押さえておきましょう。</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">imagecopyresized関数</a></li><li><a href="#toc2" tabindex="0">imagecopyresampled関数</a></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">imagecopyresized関数</span></h2>



<p><strong>iamgecopyresized関数</strong>は指定した画像の矩形部分をコピーしサイズを変更することができます。<br>処理は高速ですがリサイズ後の画像の角がギザギザになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagecopyresized($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_width, $dst_height, $src_width, $src_height);</code></pre></div>



<p>この後解説するimagecopyresampled関数も引数に渡せる値は同じです。</p>



<p>$dst_imageはコピー先となるGDImageインスタンスを渡します。</p>



<p>$src_imageには拡大/縮小したいimagecreatefrompng関数などで読み込んだ画像のGDImageインスタンスを渡してください。<br>簡単にいうとコピー元です。</p>



<p>$dst_xと$dst_yはコピー先の座標、$src_xと$src_yはコピー元の座標を渡します。</p>



<p>$dst_widthと$dst_heighにはコピー先の画像の幅と高さ、$src_widthと$src_heightにはコピー元の画像の幅と高さを渡してください。</p>



<p>画像の幅を取得するには<strong>imagesx関数</strong>、高さを取得するには<strong>imagesy関数</strong>を使用します。<br>取得したいGDImageインスタンスを渡すとその幅や高さを取得できます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$soruce = imagecreatefrompng(&#39;画像までのパス&#39;);
$width = imagesx($source);
$height = imagesy($source);
echo &quot;width: {$width}, height: {$height}&quot;;</code></pre></div>



<p>今回は<a href="https://svgporn.com/#search=php">SVGPORN</a>でダウンロードしてきたPHPのロゴ画像を縮小していきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// 画像読み込み
$source = imagecreatefrompng(&#39;./php.png&#39;);

// 元画像のサイズを取得
$originalWidth = imagesx($source);
$originalHeight = imagesy($source);

// コピー後のサイズを算出
$destinationWidth = $originalWidth / 2;
$destinationHeight = $originalHeight / 2;

$destination = imagecreate($destinationWidth, $destinationHeight);

// 1/4サイズに縮小
imagecopyresized($destination, $source, 0, 0, 0, 0, $destinationWidth, $destinationHeight, $originalWidth, $originalHeight);

header(&quot;Content-Type: image/png&quot;);
imagepng($destination);</code></pre></div>



<p>元のサイズが256×135だったので縮小して128×67.5になりました。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresized.jpg" alt="" class="wp-image-127" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresized.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresized-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresized-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc2">imagecopyresampled関数</span></h2>



<p><strong>imagecopyresampled関数</strong>はimagecopyresized関数に比べ処理は遅いですが、コピーした画像のピクセルを補間し滑らかにしてくれます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// 画像読み込み
$source = imagecreatefrompng(&#39;./php.png&#39;);

// 元画像のサイズを取得
$originalWidth = imagesx($source);
$originalHeight = imagesy($source);

// コピー後のサイズを算出
$destinationWidth = $originalWidth / 2;
$destinationHeight = $originalHeight / 2;

$destination = imagecreate($destinationWidth, $destinationHeight);

// 1/4サイズに縮小
imagecopyresampled($destination, $source, 0, 0, 0, 0, $destinationWidth, $destinationHeight, $originalWidth, $originalHeight);

header(&quot;Content-Type: image/png&quot;);
imagepng($destination);</code></pre></div>



<p>今回は画像を縮小しただけなので画像の滑らかさはほとんど分かりませんでした。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresampled.jpg" alt="" class="wp-image-128" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresampled.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresampled-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagecopyresampled-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP グラフィック処理 ~図形を描画する~</title>
		<link>https://nabeshiblog.com/php-graphic3/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Tue, 05 Oct 2021 13:20:29 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=90</guid>

					<description><![CDATA[前回はPHPで作成した画像の中にテキストを表示するというものでした。今回は画像の中に図形を描画していきます。図形を描画する関数には、指定した色を枠だけに適用するものと塗りつぶすものがあります。filledというワードがつ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回はPHPで作成した画像の中にテキストを表示するというものでした。<br>今回は画像の中に図形を描画していきます。<br>図形を描画する関数には、指定した色を<strong>枠だけに適用するもの</strong>と<strong>塗りつぶすもの</strong>があります。<br>filledというワードがついたら基本的に塗りつぶす描画関数だと思って問題ありません。</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">直線を描画する</a></li><li><a href="#toc2" tabindex="0">矩形を描画する</a></li><li><a href="#toc3" tabindex="0">多角形を描画する</a></li><li><a href="#toc4" tabindex="0">弧（円）を描画する</a></li><li><a href="#toc5" tabindex="0">楕円を描画する</a></li><li><a href="#toc6" tabindex="0">画像の回転</a></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">直線を描画する</span></h2>



<p><strong>imageline関数</strong>は直線を描画します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imageline(GDImage, start_x, start_y, end_x, end_y, color);</code></pre></div>



<p>作成した画像の左上を0として開始位置のx座標とy座標、終点位置のx座標とy座標を直線で結び、色をつけます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imageline($image, 50, 50, 150, 150, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imageline.jpg" alt="" class="wp-image-94" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imageline.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imageline-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imageline-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p><strong>imagedashedline関数</strong>を使用すると破線を描画します。<br>引数に渡せる値はimageline関数と同じです。<br>この関数は古いため線を装飾する場合は、imagesetstyle関数を使用した方が良いようです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagedashedline($image, 50, 50, 150, 150, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagedashedline.jpg" alt="" class="wp-image-95" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagedashedline.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagedashedline-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagedashedline-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc2">矩形を描画する</span></h2>



<p>矩形を描画するには<strong>imagerectangle関数</strong>か<strong>imagefilledrectangle関数</strong>のどちらかを使用します。<br>引数に渡せる値は同じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagerectangle(GDImage, top_left_x, top_left_y, bottom_right_x, bottom_right_y, color);
imagefilledrectangle(GDImage, top_left_x, top_left_y, bottom_right_x, bottom_right_y, color);</code></pre></div>



<p>左上と右下に点を取り描画します。<br>まずはimagerectangle関数を見てみましょう。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagerectangle($image, 50, 50, 150, 150, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagerectangle.jpg" alt="" class="wp-image-97" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagerectangle.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagerectangle-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagerectangle-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>imagefilled関数はこの枠線を含む内側を塗りつぶします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagefilledrectangle($image, 50, 50, 150, 150, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledrectangle.jpg" alt="" class="wp-image-98" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledrectangle.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledrectangle-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledrectangle-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc3">多角形を描画する</span></h2>



<p>多角形を描画するには<strong>imagepolygon関数</strong>か<strong>imagefilledpolygon関数</strong>のどちらかを使用します。<br><meta charset="utf-8">引数に渡せる値は同じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagepolygon(GDImage, points, number, color);
imagefilledpolygon(GDImage, points, number, color);</code></pre></div>



<p>pointsにはx座標とy座標の配列を渡します。<br>例えば、(50, 50)、(50, 150)、(150,150)この3点の座標をpointsに渡すには以下のように配列にして渡す必要があります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>[50, 50, 50,150, 150, 150];</code></pre></div>



<p>numberは描画する多角形の頂点の数を指定します。<br>３以上の値を指定する必要があります。<br>numberにはpointsの要素数を2で割った数を渡すようにしましょう。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

$points = [50, 50, 50, 150, 150, 150];
imagepolygon($image, $points, count($points) / 2, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagepolygon.jpg" alt="" class="wp-image-100" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagepolygon.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagepolygon-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagepolygon-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>imagefilledpolygon関数を使用するとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

$points = [50, 50, 50, 150, 150, 150];
imagefilledpolygon($image, $points, count($points) / 2, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledpolygon.jpg" alt="" class="wp-image-102" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledpolygon.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledpolygon-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledpolygon-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc4">弧（円）を描画する</span></h2>



<p><meta charset="utf-8">弧（円）を描画するには<strong>imagearc関数</strong>か<strong>imagefilledarc関数</strong>を使用します。<br>引数に渡せる値はstyleを除いて同じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagearc(GDImage, center_x, center_y, width, height, start_deg, end_deg, color);
imagefilledarc(GDImage, center_x, center_y, width, height, start_deg, end_deg, color, style);</code></pre></div>



<p>引数に渡す値は円の中心の座標、幅、高さ、弧の開始位置と終了位置です。<br>start_degに0を渡すと3時の方向から時計回りにend_degまでの弧を描画します。</p>



<p>imagearc関数で弧を描画するとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagearc($image, 100, 100, 200, 200, 0, 90, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagearc.jpg" alt="" class="wp-image-106" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagearc.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagearc-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagearc-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>imagefilledarc関数は引数の最後に描画するstyleを渡します。<br>styleには<strong>IMG_ARC_PIE</strong>、<meta charset="utf-8"><strong>IMG_ARC_CHORD</strong>、<meta charset="utf-8"><strong>IMG_ARC_NOFILL</strong>、<meta charset="utf-8"><strong>IMG_ARC_EDGED</strong>のいずれかの値を渡します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagefilledarc($image, 100, 100, 200, 200, 0, 90, $red, IMG_ARC_PIE);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledarc.png" alt="" class="wp-image-108" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledarc.png 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledarc-300x188.png 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledarc-768x480.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc5">楕円を描画する</span></h2>



<p>楕円を描画するには<strong>imageellipse関数</strong>か<strong>imagefilledellipse関数</strong>を使用します。<br>引数に渡せる値は同じです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>iamgeellipse(GDImage, center_x, center_y, width, height, color);
imagefilledellipse(GDImage, center_x, center_y, width, height, color);</code></pre></div>



<p>center_xとcenter_yには中心の座標、widthとheightにはそれぞれ幅と高さを渡してください。</p>



<p>imagearc関数でも楕円を描画することができますが、コードを見直した時の観点から考えると描画する図形に合わせた関数を使用するのが望ましいです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imageellipse($image, 100, 100, 200, 100, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imageellipse.jpg" alt="" class="wp-image-147" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imageellipse.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imageellipse-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imageellipse-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<p>imagefilledellipse関数を使用するとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);

imagefilledellipse($image, 100, 100, 200, 100, $red);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledellipse.jpg" alt="" class="wp-image-148" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledellipse.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledellipse-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagefilledellipse-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc6">画像の回転</span></h2>



<p>画像を回転させるには<strong>imagerotate関数</strong>を使用します。<br>この関数は描画した図形だけを回転させるのではなく、画像そのものを回転させます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagerotate($GDImage, deg, color);</code></pre></div>



<p>degに回転させる角度を渡します。</p>



<p>PHPで画像を作成すると、アートボードの上にimagecreate関数指定したサイズの画像が重なっているようなイメージになります。<br>例えば、imagecreate関数で幅200、縦200の画像を作成するとアートボードのサイズも<meta charset="utf-8">幅200、縦200のようになるようです。<br>画像を常に覆えるようにアートボードのサイズが変動してくれるみたいです。<br>画像を回転させるとアートボードと画像の重なり合って内部部分が生じます。<br>この時の色を第三引数のcolorに渡します。</p>



<p>この関数の返り値を画像出力関数（imagepng関数など）に渡さないとWeb上の画像は回転していないので注意が必要です。</p>



<p>imagerotate関数で画像を回転させるとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);

imagefilledrectangle($image, 50, 50, 150, 150, $red);

$rotate = imagerotate($image, 45, $blue, true);

header(&quot;Content-Type: image/png&quot;);

imagepng($rotate);</code></pre></div>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagerotate.jpg" alt="" class="wp-image-110" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagerotate.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagerotate-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagerotate-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP グラフィック処理 ~テキストを描画する~</title>
		<link>https://nabeshiblog.com/php-graphic2/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Tue, 05 Oct 2021 02:45:16 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=73</guid>

					<description><![CDATA[前回は画像のサイズと色を指定して出力するだけでしたが、今回は作成した画像の中にテキストを描画する方法を紹介していきます。 目次 テキストを描画するimagestring関数imagettftext関数テキストの大きさを取 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回は画像のサイズと色を指定して出力するだけでしたが、今回は作成した画像の中にテキストを描画する方法を紹介していきます。</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">テキストを描画する</a><ul><li><a href="#toc2" tabindex="0">imagestring関数</a></li><li><a href="#toc3" tabindex="0">imagettftext関数</a></li></ul></li><li><a href="#toc4" tabindex="0">テキストの大きさを取得する</a></li><li><a href="#toc5" tabindex="0">まとめ</a></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">テキストを描画する</span></h2>



<p>テキストを描画するには<strong>imagestring関数</strong>か<strong>imagettftext関数</strong>のいずれかを使用します。</p>



<h3 class="wp-block-heading"><span id="toc2">imagestring関数</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagestring(GDImage, font_id, x, y, text, color);</code></pre></div>



<p>GDImageはimagecreate関数などの返り値を渡してください。</p>



<p>font_idには1〜5の数値を指定します。<br>数値が5に近づくほど描画するフォントサイズが大きくなります。<br><strong>imageloadfont関数</strong>でユーザー定義のビットマップを読み込んで独自のfont_idを使えるようにする方法もあります。<br>バイナリ形式のデータなので読み込むコンピュータに依存してしまいます。</p>



<p>imagecreate関数などで作成した画像の左上を0として、文字を表示する位置をxとyに渡します。</p>



<p>textには表示する文字を渡します。<br>マルチバイトには対応していないので日本語を渡すと文字化けします。</p>



<p>colorは<strong>imagecolorallocate関数</strong>の返り値を渡します。<br>2回目以降のimagecolorallocate関数の呼び出しは変数に代入しておくと使いやすいです。</p>



<p>白色の画像の中に黒色のDEMOという文字を表示して出力してみます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);

$textColor = imagecolorallocate($image, 0, 0, 0);

imagestring($image, 5, 50, 50, &quot;DEMO&quot;, $textColor);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<p>このようになっていれば正解です。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagestring.jpg" alt="" class="wp-image-76" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagestring.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagestring-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagestring-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h3 class="wp-block-heading"><span id="toc3">imagettftext関数</span></h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagettftext(GDImage, size, angle, x, y, color, path, text);</code></pre></div>



<p><strong>imagettftext関数</strong>はimagestring関数より細かい設定が可能です。<br>imagestring関数ではフォントサイズを1〜5で設定していましたが、imagettftext関数はピクセルで指定できます。<br>他にも表示する文字の角度を変えたり、使用するフォントを選べます。<br>日本語に対応しているフォントであれば日本語を表示することも可能です。<br>imagettftext関数はデフォルトでアンチエイリアス処理が施されているのが特徴的です。</p>



<p>スクリプトと同じディレクトリにあるDIN Bold.otfのフォントでテキストを縦に表示しようとすると以下のようなコードになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);

$textColor = imagecolorallocate($image, 0, 0, 0);

imagettftext($image, 20, 270, 50, 50, $textColor, &quot;./DIN Bold.otf&quot;, &quot;DEMO&quot;);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<p>imagettftext関数を使用するとWebフォントを使用できるのが強いですね。<br>このようになっていれば正常に動作しています。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagettftext.jpg" alt="" class="wp-image-84" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagettftext.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagettftext-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagettftext-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc4">テキストの大きさを取得する</span></h2>



<p>フォントサイズではなく、テキストを表示する領域の大きさを取得するには<strong>imagettfbbox関数</strong>を使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagettfbbox($size, $angle, $font, $text);</code></pre></div>



<div class="wp-block-cocoon-blocks-column-2 column-wrap column-2 column-2-2-1-1 layout-box">
<div class="wp-block-cocoon-blocks-column-left column-left">
<p>返り値は要素数が8の配列形式で返される。</p>
</div>



<div class="wp-block-cocoon-blocks-column-right column-right">
<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>キー</td><td>内容</td></tr><tr><td>0</td><td>左下のX座標</td></tr><tr><td>1</td><td>左下のY座標</td></tr><tr><td>2</td><td>右下のX座標</td></tr><tr><td>3</td><td>右下のY座標</td></tr><tr><td>4</td><td>右上のX座標</td></tr><tr><td>5</td><td>右上のY座標</td></tr><tr><td>6</td><td>左上のX座標</td></tr><tr><td>7</td><td>左上のY座標</td></tr></tbody></table></figure>
</div>
</div>



<p>テキストの表示領域を計算するには、</p>



<ul class="wp-block-list"><li>右下のX座標から左下のX座標を引いた絶対値</li><li>右上のY座標から右下のY座標を引いた絶対値</li></ul>



<p>で求められます。</p>



<h2 class="wp-block-heading"><span id="toc5">まとめ</span></h2>



<ul class="wp-block-list"><li>画像にテキストを描画する方法として<strong>imagestring関数</strong>と<strong>imagettftext関数</strong>がある</li><li>imagestring関数は1〜5の間でフォントサイズを決定する<br>imageloadfont関数でユーザー定義のフォントを読み込むことができるが、マシン依存してしまう</li><li>imagettftext関数はフォントサイズをピクセルで指定できる<br>また、表示するテキストの角度を変えたり、サーバーにあるフォントを読み込んでテキストのフォントを変更することができる</li><li>テキストの表示領域サイズを求めるには<strong>imagettfbox関数</strong>を使用する</li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP グラフィック処理 ~基礎~</title>
		<link>https://nabeshiblog.com/php-graphic1/</link>
		
		<dc:creator><![CDATA[なべし]]></dc:creator>
		<pubDate>Tue, 05 Oct 2021 00:47:18 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php技術者認定試験]]></category>
		<category><![CDATA[資格]]></category>
		<guid isPermaLink="false">https://nabeshiblog.com/?p=52</guid>

					<description><![CDATA[PHP5技術者認定試験上級のためにPHPで動的に画像を生成する方法を勉強しているのですが、「この技術まだ使うのだろうか」という思いがありグラフィックスの章の勉強が非常に億劫になっています。グラフィックスの出題割合は0.0 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHP5技術者認定試験上級のためにPHPで動的に画像を生成する方法を勉強しているのですが、<br>「この技術まだ使うのだろうか」という思いがありグラフィックスの章の勉強が非常に億劫になっています。<br>グラフィックスの出題割合は0.04と少ないですが、この章を捨てる勇気もないので頭の整理ついでにアウトプットとして残しておきます。</p>




  <div id="toc" class="toc tnt-none toc-center tnt-none border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ul class="toc-list open"><li><a href="#toc1" tabindex="0">グラフィック基本概念</a><ul><li><a href="#toc2" tabindex="0">ピクセル</a></li><li><a href="#toc3" tabindex="0">ファイルフォーマット</a><ul><li><a href="#toc4" tabindex="0">GIF</a></li><li><a href="#toc5" tabindex="0">PNG</a></li><li><a href="#toc6" tabindex="0">JPEG</a></li></ul></li></ul></li><li><a href="#toc7" tabindex="0">アンチエイリアス</a></li><li><a href="#toc8" tabindex="0">画像を描画する</a><ul><li><a href="#toc9" tabindex="0">既存の画像読み込む</a></li><li><a href="#toc10" tabindex="0">新規に画像を作成する</a></li><li><a href="#toc11" tabindex="0">画像で使用する色を決める</a></li><li><a href="#toc12" tabindex="0">画像を出力する</a></li></ul></li><li><a href="#toc13" tabindex="0">まとめ</a></li></ul>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">グラフィック基本概念</span></h2>



<p>PHPで画像を生成する云々の前に、グラフィックについての最低限の理解をしておく必要があります。</p>



<h3 class="wp-block-heading"><span id="toc2">ピクセル</span></h3>



<p>画像はさまざまな色のピクセル（四角）の集まりです。<br>Photoshopなどの画像編集ツールを使ったことがある人であれば一度は画像を切り抜きしたことがあるかと思います。<br>その時に画像をズームすると細かい小さな四角が見えるのですが、それがピクセルの正体です。<br>このピクセルが多ければ多いほど画像は滑らかで非常に鮮明に見えますが、反対にピクセルが少なければ粗い画像になります。</p>



<h3 class="wp-block-heading"><span id="toc3">ファイルフォーマット</span></h3>



<p>画像ファイルは単にピクセルを並べただけではなくファイルフォーマットに従ってデータを圧縮します。<br>代表的なものでいうと、PNG、JPEG、GIFがあります。<br>それぞれフォーマットには特徴があるので簡単にまとめておきます。</p>



<h4 class="wp-block-heading"><span id="toc4">GIF</span></h4>



<ol class="wp-block-list"><li><span style="text-align: -webkit-match-parent;">可逆圧縮</span></li><li>透過処理ができる</li><li>データ容量が小さい</li><li>アニメーションが作れる</li><li>表現できる色が256色</li></ol>



<h4 class="wp-block-heading"><span id="toc5">PNG</span></h4>



<ol class="wp-block-list"><li><span style="text-align: -webkit-match-parent;">可逆圧縮</span></li><li>透過処理ができる</li></ol>



<h4 class="wp-block-heading"><span id="toc6">JPEG</span></h4>



<ol class="wp-block-list"><li>非可逆圧縮</li><li>フルカラー1670万色まで扱える</li></ol>



<h2 class="wp-block-heading"><span id="toc7">アンチエイリアス</span></h2>



<p>コンピュータの画面上は写真のように細かい四角がズラーっと並べられていて、その細かい四角に色をつけることで文字や線を表現しています。<br>文字や線をズームしてみると角がギザギザしているのが分かるかと思います。<br>これをエイリアスといいます。<br>このギザギザを目立たなくする工夫がアンチエイリアスです。</p>



<h2 class="wp-block-heading"><span id="toc8">画像を描画する</span></h2>



<p>PHPで画像を描画するにはまず、「既存の画像読み込む」か「新規に画像を作成する」のどちらかを実行しなければなりません。</p>



<h3 class="wp-block-heading"><span id="toc9">既存の画像読み込む</span></h3>



<p>まずは、加工したい画像をPHPのスクリプトに読み込む必要があります。<br>その時に利用するのが<strong>imagecreatefrompng関数</strong>です。<br>この関数はPNGの画像を読み込む時に利用します。<br>他にもJPEGやGIFを読み込むときはフォーマットに応じた<strong>imagecreatefromjpeg関数</strong>、i<strong>magecreatefromgif関数</strong>を呼び出す必要があります。<br>これらの関数の返り値はGDImageのインスタンスになります。<br>画像を加工する場合はこのインスタンスを使い回すので必ず変数に代入しておいてください。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreatefrompng(&quot;画像までのパス&quot;);</code></pre></div>



<h3 class="wp-block-heading"><span id="toc10">新規に画像を作成する</span></h3>



<p>PHPで画像を作成するには<strong>imagecreate関数</strong>か<strong>imagecreatetruecolor関数</strong>のどちらかを使用します。<br>パレットを使用する画像を作成するときは<strong>imagecreate関数</strong>、トゥルーカラーの画像を作成するときはi<strong>magecreatetruecolor関数</strong>を使用します。<br>どちらの関数も引数には画像の幅と高さを渡す必要があります。<br>これらの関数はGDimageのインスタンスを返すので、imagecreatefrompng関数の時と同様に変数に入れて使い回せるようにしておきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);</code></pre></div>



<h3 class="wp-block-heading"><span id="toc11">画像で使用する色を決める</span></h3>



<p>画像で使用する色を決めるには<strong>imagecolorallocate関数</strong>を使用します。<br>引数に取る値は以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>imagecolorallocate(GDImageインスタンス, 0~255, 0~255, 0~255); </code></pre></div>



<p>第二引数から第四引数までの値は16進数でも指定できます。<br>Red、Green、Blueの順に値を設定します。<br>この関数は色のIDを返します。<br>生成したいろを使い回したい場合は変数に代入しておいてください。<br>また、この関数を最初に呼び出し指定した色がimagecreate関数またはimagecreatetruecolor関数の背景色になります。<br>2回呼び出しても1回目の色が背景色に指定されるので注意が必要です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>// width: 200px, height: 200pxの画像を作成
$image = createimage(200, 200);

// $imageの背景色を白色に設定
imagecolorallocate($image, 255, 255, 255);

// 赤色のIDを生成
imagecolorallocate($image, 255, 0, 0);</code></pre></div>



<h3 class="wp-block-heading"><span id="toc12">画像を出力する</span></h3>



<p>これまでに登場した関数は描画する画像の元を作っていただけに過ぎません。<br>今度はちゃんと出力してWeb上で確認できるようにします。</p>



<p>画像を出力する工程は以下の２つに分けられます。</p>



<ol class="wp-block-list"><li>レスポンスヘッダーでContent-Typeを設定する</li><li>出力する画像のフォーマット形式を決定し、出力する</li></ol>



<p>この1, 2の順が逆転するだけで出力されないので注意が必要です。</p>



<p>Content-Typeはサーバーからクライアントに返されたコンテンツを示すのに利用されるレスポンスヘッダーです。<br>例えば、HTMLのContent-Typeはtext/htmlです。<br>PNGであればimage/png、JPEGであればimage/jpegになります。<br>Content-Typeがimage/pngのレスポンスを返すには以下の記述が必要です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>header(&quot;Content-Type: image/png&quot;);</code></pre></div>



<p>画像を出力する処理は<strong>imagepng関数</strong>、<strong>imagegif関数</strong>、<strong>imagejpeg関数</strong>などを使用します。<br>出力したい画像フォーマット形式の関数を使用してください。<br>Content-Typeと出力する画像のフォーマットが一致していなくても問題なく描画できますが、一致させておくことがベターです。</p>



<p>これまでに紹介した関数を使用してWeb上に画像を出力する一連の処理は以下のようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-lang="PHP"><code>$image = imagecreate(200, 200);

imagecolorallocate($image, 255, 255, 255);

header(&quot;Content-Type: image/png&quot;);

imagepng($image);</code></pre></div>



<p>ブラウザでこのように表示されていれば正常に動作しています。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="625" src="https://nabeshiblog.com/wp-content/uploads/2021/10/imagepng.jpg" alt="" class="wp-image-66" srcset="https://nabeshiblog.com/wp-content/uploads/2021/10/imagepng.jpg 1000w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagepng-300x188.jpg 300w, https://nabeshiblog.com/wp-content/uploads/2021/10/imagepng-768x480.jpg 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading"><span id="toc13">まとめ</span></h2>



<ul class="wp-block-list"><li>PHPでWeb上に画像を表示するにはまず、「既存の画像を使用する」か「画像を新しく作る」のどちらかを選択する。</li><li>「既存の画像を使用する」場合、読み込む画像のフォーマットにあった関数を使用する。<br>例）<strong>imagecreatepng(&#8220;画像までのパス&#8221;)</strong>;</li><li>「画像を新しく作る」場合は、<strong>imagecreate関数</strong>か<strong>imagecreatetruecolor関数</strong>のどちらかを使用する。</li><li>GDImageインスタンスに色を指定するには<strong>imagecolorallocate関数</strong>を使用する。<br>最初に呼び出したimagecolorallocateの指定した色が背景色になる。</li><li>加工または作成した画像をWeb上に表示するには「Content-Typeを指定する」と「画像を出力する」の工程が必要。<br>この工程が逆転すると表示されなくなるので注意。</li><li>header関数でContent-Typeに出力する画像のフォーマットを記述する。<br>例）header(&#8220;Content-Type: image/png&#8221;);</li><li>出力したい画像のフォーマットに合わせて出力関数を呼び出す。<br>例）imagepng(GDImageインスタンス);</li></ul>



<p>試験まで残り２週間ですが試験範囲が全然終わりません。。。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
