質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

1回答

2418閲覧

ImageMagickで画像とテキストの合成ができない

yamamotomakoto

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

0クリップ

投稿2019/03/13 01:18

編集2019/03/14 14:00

PHP+ImageMagickで画像とテキストの合成をしたいのですが下記のエラーが出てしまいます。どなたか原因わかる方いらっしゃいませんか?
よろしくお願いします。
Fatal error: Uncaught ImagickException: non-conforming drawing primitive definition `text'

PHP

1$filePath = "p1.png"; 2$templateImg = new Imagick( $filePath ); 3$draw = new ImagickDraw(); 4$draw->setFontSize( 24 ); 5$draw->annotation( 0, 0, "test" ); 6$templateImg->drawImage($draw); 7$templateImg->writeImage("o1.png"); 8$templateImg->destroy(); 9

各バージョンは以下です。
PHP 7.2.14
ImageMagick 3.4.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/13 01:21

細かいですが「ImageMagick」では? タグもあるので追加しておいてください。 また、コードはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/help#about-markdown
yamamotomakoto

2019/03/13 01:29

ありがとうございます。ImageMagickだけ取り急ぎ修正しました。マークダウンは今時間がないため後で修正します。
m.ts10806

2019/03/13 01:31 編集

タイトルもなおしてもらいたいのですが… >マークダウンは今時間がないため後で修正します。 そうですか。ではその対応がなされてから確認します。正しくコードが提示されてないことになりますので、正しく再現確認がとれないことになりますので。
yamamotomakoto

2019/03/13 03:04

移動中でしたすみません。修正しました。よろしくお願いします。
m.ts10806

2019/03/13 03:17

念のため、PHPとImageMagickのバージョンも質問に追記いただけますか?
m.ts10806

2019/03/13 04:19 編集

すみません。ImageMagick環境をそろえるのが難しい環境みたいで。 私のほうでは再現確認ができないようです。 ちょっと別角度で調べてみます。
yamamotomakoto

2019/03/13 10:35

返信おそくなりすみません。調査していただけるなんて本当にありがとうございます。
m.ts10806

2019/03/13 12:23

こちらも遅くなってすみません。 今回のコードで参考にした記事ってありますか? 何か抜けてるかもしれないですし
m.ts10806

2019/03/13 14:16

確認です。画像だけの表示はできてるということですよね・?
yamamotomakoto

2019/03/14 01:39 編集

$draw = new ImagickDraw(); $draw->setFontSize( 24 ); $draw->annotation( 0, 0, "test" ); $templateImg->drawImage($draw); この3行をコメントアウトすると表示できます。 コードはPHPの本家のマニュアルをみてかきました。
m.ts10806

2019/03/14 01:42

このうちの後ろの三行ですよね
Stan_Dma

2019/03/14 02:17

Did you get the code from the User Contributed Notes on the online manual? Might not be trusty.
m.ts10806

2019/03/14 13:05

Stan_Dmaさん 日本人なんですから日本語で。ちょっとそろそろいい加減にしてください。
Stan_Dma

2019/03/15 13:26 編集

Thanks. I would take the CoC or leave it. BTW, the second argument of the annotation method, value for height of a text object, should not be zero. Giving more than zero could produce the result you need, I suppose.
Stan_Dma

2019/03/15 06:36

There exist some code in the internet that uses "$templateImg->queryFontMetrics($draw, $text);" to get its font metrics and gives the second argment using the metrics like "$draw->annotation( 0, $metrics['ascender'], $text );" . HTH.
guest

回答1

0

ベストアンサー

少し試してもらいたいのですが良いでしょうか。

ImagickDraw クラスより。

※すべて一気にするのではなく1つ1つ試してみてください。

  • ImagickDraw::comment でコメントを追加してみる。
  • ImagickDraw::circle で画像の上に円をかいてみる。
  • ImagickDraw::setFont してからsetFontSize、annotation
  • annotationのx、yの座標を変えてみる

ただ、マニュアルに不整合な部分があったりしますね。
ImagickDraw::annotationは説明に ImagickDraw::annotation ( float $x , float $y , string $text ) : boolとあってboolがreturnされるかと思ったら「値を返しません。 」を書いてあったり。
返さないならvoidのはずですが・・・。
念のためannotationの返却値をとるようにデバッグ入れてみてください。

php

1$ano = $draw->annotation( 0, 0, "test" ); 2var_dump($ano);

あまり私はこういった拡張機能を使ったことがないのですが、
拡張機能がゆえに、マニュアルの更新が確実に行われていないのかもしれません。
どうしてもImagickDrawでなければならない、のでなければ
GDライブラリの利用も検討してみてください。
拡張機能ですが今ではデフォルトで使えますし、よほど複雑な描画でなければ可能なはずです。
(結構動作が重たいとか気になる点はありますが・・・)

投稿2019/03/14 13:39

編集2019/03/14 14:00
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamamotomakoto

2019/03/16 03:43

返信おそくなり申し訳ございません。解決ではないですが別の方法が見つかりました。 ats10806さんに教えていただいたデバック方法をもとにfontをセットしたり、$draw->annotationの戻り値を確認しましたが(trueでした)のでもう一度マニュアル見返すとImagickのクラスにも同じようなメソッド(Imagick::annotateImage )があったのでそちらをためしたところうまくいきました。 マニュアルに書いてあることが正しいと思い込んでいたので一人で悩んでいたら一生解決できませんでした。 ありがとうございました。
m.ts10806

2019/03/16 03:46

解決されたようで何よりです。 マニュアルの仕様部分は正しいと思って良いですがNoteはあくまでユーザーが投稿できる部分なので検証は必要ですね。 古い投稿になればなるほど今の環境では動かない可能性もあがります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問