Twitterなどで、画像に文字入れされているつぶやき(質問箱など)をよく見かけますよね。
自分のアプリでもそういうことできないかな~と思って調べてみたところ、HTML5 のCanvasとWeb 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…
コメント