メディア掲載: レバテックフリーランス様のサイトで当ブログが紹介されました

画像に文字入れしてシェアする機能を作る(Canvas / Web Share API)

Twitterなどで、画像に文字入れされているつぶやき(質問箱など)をよく見かけますよね。

自分のアプリでもそういうことできないかな~と思って調べてみたところ、HTML5 のCanvasWeb Share APIなるものを使えば、利用環境は限定されるものの、かなり簡単に実装できそうだったので試してみました。

2020年7月28日時点では、画像付きでシェアが可能な Web Share API Level2はAndroid版Chromeのみの対応のようです。(文字だけのシェアであればMac,iOSのSafariも対応)

デモ:トイプードルのひとこと

つぶやきたい文字を入力して、SHAREボタンを押してね!
(このデモはAndroidのChromeのみ対応しています)

SHARE

ソース

Canvasで背景画像(我が家のかわいいトイプードル)を描画し、その上にテキストボックスの文字も描画します。

Shareボタン押下時は、toBlobでキャンバスをBlobに変換後、pngに変換して、Web Share APIでシェアする流れになっています。

HTML

<div>
    <input id="text-box" type="text" placeholder="画像に重ねる文字を入力...">
</div>
<div>
    <canvas id="cv" width="1200" height="675" style="width: 600px"></canvas>
</div>
<div>
    <span id="btn" onclick="share()">SHARE</span>
</div>

CSS

#text-box {
    width: 600px;
    padding: 10px 10px; 
    font-size: 16px;
    border-radius: 3px;
    box-sizing: border-box;
}

div {
    margin-bottom: 30px;
    text-align: center;
}

#btn {
    box-sizing: border-box;
    padding: 10px 20px;
    background: royalblue;
    color: white;
    cursor: pointer; 
    transition: 100ms
}

#btn:active {
    color: royalblue;
    background: white;
    border: solid 1px royalblue;
}

JavaScript

// テキストボックス
const textBox = document.getElementById("text-box")

// 背景画像
const bgImg = new Image()
bgImg.src = "bg-img.png"

// Canvas準備
const canvas = document.getElementById("cv")
const context = canvas.getContext("2d")

// 背景画像読込後にCanvasに描画
bgImg.onload = () => {
    context.drawImage(bgImg, 0, 0)
}

// 文字入力時に描画処理を呼び出す
textBox.addEventListener("input", () => {
    drawText(textBox.value)
})

// 描画処理
function drawText(text) {
    context.clearRect(0, 0, canvas.width, canvas.height)    // クリア
    context.drawImage(bgImg, 0, 0)                          // 背景画像描画
    context.fillStyle = 'black'                             // テキストカラーを指定
    context.font = "60px 'Kosugi Maru'"                     // フォントを指定
    context.textAlign = "center"                            // 左右中央
    context.textBaseline = "middle"                         // 上下中央
    context.fillText(text, 550, 250, 900);                  // テキスト描画
}

// シェアする処理
function share(){
    // Web Share APIの対応判定
    if (navigator.share !== undefined){
        // CanvasをBlobに変換→pngに変換
        canvas.toBlob( (blob) => {
            const shareImg = new File([blob], 'share.png', {type: 'image/png'})
            // シェア
            navigator.share({
                text: "トイプードルのひとこと",
                url: "https://web-breeze.net/add-text-to-image-and-share/",
                files: [shareImg]
            })
        })
    } else {
        alert("ご利用のブラウザがWeb Share APIに対応していません・・・")
    }
}

*このサンプルではブラウザやOSの厳密な判定はしていません。(Web Share APIのLevel2のみ未対応の環境では、動作しないうえにエラーも出ません。)
必要に応じて、OSやブラウザ・バージョンの判定を入れてください。

ここまで作ってから気づいた・・・

今自分が作っているアプリはCordovaアプリなのですが、AndroidのWebVIEWはWeb Share APIに対応してない・・・

参考サイト

Web Share API Level2を使ってアプリ連携無しでTwitterに画像を投稿する - Qiita
ブラウザから直接ネイティブにインストールされているアプリの共有機能(下の画像参照)を呼び出す、Web Share APIという機能があります。メッセージやURLなどのテキストの共有は、Web Sh…

コメント

タイトルとURLをコピーしました