問題は、あなたがImageMagickのあなたがutf8_decode
INGであるに「ラインスプリッタ」(wordWrapAnnotation
)の出力を供給しているありますテキスト入力。あなたが中国語のテキストを扱っているなら、これは間違いです。 utf8_decode
は、ISO-8859-1(ASCIIの最も一般的な8ビット拡張)に変換できるUTF-8テキストのみを扱うことができます。
ここでは、テキストがUTF-8にエンコードされていることを願っています。
$text = mb_convert_encoding($text, 'UTF-8', 'BIG-5');
またはこの
$text = mb_convert_encoding($text, 'UTF-8', 'GB18030'); // only PHP >= 5.4.0
(コード内で$text
ではなく$text1
と$text2
である)のような:それはされていない場合、あなたはこのようにそれを変換することができるかもしれません。
次に、あなたのコードに修正する(少なくとも)二つのものがあります:(utf8_decode
なし)「であるとして」
- がテキストを渡す
wordWrapAnnotation
には、
- 変更
"utf-8"
からsetTextEncoding
の引数に私はあなたのコード内のすべての変数は、それのいくつか欠けている部分に初期化されることを願っていますspecs
あたりとして"UTF-8"
。上記の2つの変更(2つ目は必要ではないかもしれませんが、あなたは決して知らないかもしれません...)、そして欠けている部分があると、あなたのTTFファイルが壊れていないか、 Imagick
ライブラリが壊れています(imagemagick
、その上にImagick
があります。これは素晴らしいライブラリです。
EDIT:あなたの要求に続いてが
、私は私の答えを更新
a)は、あなたのanswerに言うようmb_internal_encoding('utf-8')
を設定すると、解決のために非常に重要であるという事実、そして
b)より良いラインスプリッタを提案しました。これは西洋言語と中国語の両方に対応しており、おそらく韓漢字(漢字と韓国語の漢字)を使用する他の言語の出発点です:
012すなわち
function wordWrapAnnotation(&$image, &$draw, $text, $maxWidth)
{
$regex = '/(|(?=\p{Han})(?<!\p{Pi})(?<!\p{Ps})|(?=\p{Pi})|(?=\p{Ps}))/u';
$cleanText = trim(preg_replace('/[\s\v]+/', ' ', $text));
$strArr = preg_split($regex, $cleanText, -1, PREG_SPLIT_DELIM_CAPTURE |
PREG_SPLIT_NO_EMPTY);
$linesArr = array();
$lineHeight = 0;
$goodLine = '';
$spacePending = false;
foreach ($strArr as $str) {
if ($str == ' ') {
$spacePending = true;
} else {
if ($spacePending) {
$spacePending = false;
$line = $goodLine.' '.$str;
} else {
$line = $goodLine.$str;
}
$metrics = $image->queryFontMetrics($draw, $line);
if ($metrics['textWidth'] > $maxWidth) {
if ($goodLine != '') {
$linesArr[] = $goodLine;
}
$goodLine = $str;
} else {
$goodLine = $line;
}
if ($metrics['textHeight'] > $lineHeight) {
$lineHeight = $metrics['textHeight'];
}
}
}
if ($goodLine != '') {
$linesArr[] = $goodLine;
}
return array($linesArr, $lineHeight);
}
:入力が最初に除去され、先頭と末尾の空白を除いて、単一空間と、改行を含む、空白のすべての実行を置き換えることによってクリーンアップされます。それから、スペースで分割されます。または、先頭の文字(前かっこや引用符など)が前にない漢字の直前、または「先頭」文字の直前に分割されます。線は、分割ルールでは不可能な場合を除いて水平方向に$maxWidth
ピクセル以上レンダリングされないように組み立てられます(この場合、最終的なレンダリングはおそらくオーバーフローします)。オーバーフローケースで分割を強制するための変更は難しくありません。たとえば、中国語の句読点はUnicodeではHanとして分類されないため、「先頭」の句読点を除いて、アルゴリズムによって改行記号を挿入することはできません。ここ
中国語のテキスト?最初に中国のシンボルのグラフィックを作成し、イメージにマージするのはどうですか? – hakre
どうすればいいのですか? –
さて、それぞれの中国語文字について、それを表示する1つのイメージを作成してください。次に、これらの画像をまとめます。最善の方法ではないかもしれませんが、いくつかの中国語フォントを実際に使用するために問題を解決するかもしれません。 – hakre