PHP GD PNG アルファチャンネル

録画システム「Chinachu」と連携するHLS Viewerみたいなものを作成中なのですが、HLSでストリーミング中に「何kbpsの映像ですよ」とウォーターマーク画像を埋め込みたいと思いました。試してみるとffmpegでストリームの作成中にアルファチャンネルが有効なPNG画像を埋め込むと背景の動画が透過されていい感じです。ついでなので埋め込むPNG画像もPHPのGD関数で作ってしまえば言うこと無しなので日本語対応は必要ないので作ってみました。

画像サンプル


<?php 
mk_watermark('TEST','watermark.png');

function mk_watermark($text, $file = NULL, $s = 5, $a = 0.3) {
    // フォントサイズの設定(1?5)
    if (!is_numeric($s) || ($s < 1 || $s > 5)) {
        $size = 5;
    } else {
        $size = $s;
    }

    // 透過度の設定(不透明:0 ? 透明:127)
    $alpha = round(127 * $a);
    if ($alpha < 0 || $alpha > 127) {
        $alpha = round(127 * 0.3);
    }

    // GD イメージの作成(アルファチャンネルを有効にする)
    $len = strlen($text);
    $w = imageFontWidth($size);
    $h = imageFontHeight($size);
    // 余白はフォントの高さの50%を基本とする
    $spc = round($h * 0.5);
    $gd = imageCreateTrueColor(($w * $len) + ($spc * 3), $h + ($spc * 2));
    imageAlphaBlending($gd, false);
    imageSaveAlpha($gd, true);

    // 背景色の設定
    $bc = imageColorAllocateAlpha($gd, 0, 0, 0, $alpha);
    imageFill($gd, 0, 0, $bc);

    // 文字色の設定
    $tc = imageColorAllocateAlpha($gd, 255, 255, 255, $alpha);

    imageString($gd, $size, $spc * 1.5, $spc, $text, $tc);

    // 画像の出力
    if ($file == NULL) {
        header("Content-Type: image/png");
    }
    imagePng($gd, $file, 0);

    imageDestroy($gd);
    return true;
}

?>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください