PHP
GDによる画像処理
サーチ…
備考
header("Content-Type: $mimeType");
を使用する場合header("Content-Type: $mimeType");
そしてimage____
出力にのみ画像を生成するために、後にも空白行を注意し、他には何も出力にしてください?>
。 (それは追跡するのが難しい「バグ」かもしれません - あなたはイメージがなく、理由は何もわかりません)。一般的なアドバイスは?
イメージの作成
空のイメージを作成するには、 imagecreatetruecolor
関数を使用します。
$img = imagecreatetruecolor($width, $height);
$img
は$width
x $height
ピクセルのイメージリソースのリソース変数になりました。左から右への幅のカウント、および高さは上から下へのカウントに注意してください。
イメージリソースは、次のようなイメージ作成機能から作成することもできます。
-
imagecreatefrompng
-
imagecreatefromjpeg
- 他の
imagecreatefrom*
関数。
イメージリソースは、後でそれらへの参照がなくなったときに解放されることがあります。しかし、メモリをただちに解放するには(大きな画像をたくさん処理している場合は重要です)、使用しなくなった画像にimagedestroy()
を使用するのは良い方法です。
imagedestroy($image);
画像の変換
イメージ変換によって作成されたイメージは、出力するまでイメージを変更しません。したがって、イメージコンバーターは3行のコードと同じくらい単純になります。
function convertJpegToPng(string $filename, string $outputFile) {
$im = imagecreatefromjpeg($filename);
imagepng($im, $outputFile);
imagedestroy($im);
}
画像出力
image*
関数を使用してimage*
作成できます。 *
はファイル形式です。
彼らは共通してこの構文を持っています:
bool image___(resource $im [, mixed $to [ other parameters]] )
ファイルに保存する
イメージをファイルに保存する場合は、ファイル名またはオープンされたファイルストリームを$to
渡すことができます。ストリームを渡す場合、ストリームを閉じる必要はありません.GDはストリームを自動的に閉じます。
たとえば、PNGファイルを保存するには:
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
fopen
を使用する場合は、ファイルがバイナリ出力であるため、 t
フラグではなくb
フラグを必ず使用してください。
fopen("php://temp", $f)
またはfopen("php://memory", $f)
をそれに渡さないでください。ストリームはコール後に関数によって閉じられるため、その内容を取得するなど、ストリームをさらに使用することはできません。
HTTPレスポンスとしての出力
このイメージをイメージのレスポンスとして直接返す場合(たとえば、動的バッジを作成する場合など)、第2引数として何も渡す(またはnull
渡す)必要はありません。ただし、HTTP応答では、コンテンツタイプを指定する必要があります。
header("Content-Type: $mimeType");
$mimeType
は、返す形式のMIMEタイプです。例としては、 image/png
、 image/gif
、 image/jpeg
ます。
変数への書き込み
変数に書き込むには2通りの方法があります。
OB(出力バッファリング)
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
ストリームラッパーの使用
あなたは、出力バッファリングを使用したくない多くの理由があります。たとえば、既にOBを持っているかもしれません。したがって、代替案が必要です。
stream_wrapper_register
関数を使用すると、新しいストリームラッパーを登録できます。したがって、ストリームを画像出力関数に渡して、後でそれを取得することができます。
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
この例では、 GlobalStream
クラスは任意の入力を参照変数に書き込みます(つまり、指定された名前のグローバル変数に間接的に書き込む)。グローバル変数は、後で直接取得することができます。
注目すべきいくつかの特別なことがあります:
- 完全に実装されたストリームラッパークラスは次のようになります。 これが、用いた試験によると
__call
魔法の方法、唯一stream_open
、stream_write
とstream_close
内部関数から呼び出されます。 -
fopen
呼び出しでフラグは必要ありませんが、少なくとも空の文字列を渡す必要があります。これは、fopen
関数がそのようなパラメータを期待しているためであり、stream_open
実装でそれを使用しなくても、まだダミーのものが必要です。 - テストによると、
stream_write
は複数回呼び出されます。使用してください.=
(連結割り当て)ではなく=
(直接変数代入)。
使用例
<img>
HTMLタグでは、外部リンクを使用せずに画像を直接提供することができます。
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';
画像の切り抜きとサイズ変更
イメージがあり、新しいイメージを作成したい場合は、新しい次元を使用して、 imagecopyresampled
関数を使用できます。
まず、希望する寸法の新しいimage
を作成します。
// new image
$dst_img = imagecreatetruecolor($width, $height);
元の画像を変数に格納することができます。これを行うには、 createimagefrom*
関数の1つを使用します(*は以下を意味します)。
- jpeg
- gif
- PNG
- 文字列
例えば:
//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));
imagecopyresampled
によって元のイメージ(src_img)のすべて(または一部)を新しいイメージ(dst_img)にコピーします。
imagecopyresampled($dst_img, $src_img,
$dst_x ,$dst_y, $src_x, $src_y,
$dst_width, $dst_height, $src_width, $src_height);
src_*
およびdst_*
ディメンションを設定するには、次のイメージを使用します。
次に、ソース(初期)イメージ全体をコピー先エリア全体にコピーしたい場合(クロップなし):
$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image