1. ホーム
  2. javascript

[解決済み] HTML5 canvasでぼやけたテキストを修正するにはどうすればよいですか?

2022-11-19 05:17:48

質問

私は、全 n00b HTML5 で作業しており canvas を使用して図形、色、およびテキストをレンダリングしています。私のアプリでは ビューアダプタ を使用しており、動的に canvas を作成し、コンテンツで埋めています。これは、テキストが非常にぼやけた感じで表示されることを除けば、非常にうまく機能します。他の多くの投稿を見ると、なぜ 高さ CSS で定義するとこの問題が発生しますが、私はすべて javascript .

該当するコード(表示 フィドル ):

var width  = 500;//FIXME:size.w;
var height = 500;//FIXME:size.h;
    
var canvas = document.createElement("canvas");
//canvas.className="singleUserCanvas";
canvas.width=width;
canvas.height=height;
canvas.border = "3px solid #999999";
canvas.bgcolor = "#999999";
canvas.margin = "(0, 2%, 0, 2%)";
    
var context = canvas.getContext("2d");

//////////////////
////  SHAPES  ////
//////////////////
    
var left = 0;

//draw zone 1 rect
context.fillStyle = "#8bacbe";
context.fillRect(0, (canvas.height*5/6)+1, canvas.width*1.5/8.5, canvas.height*1/6);

left = left + canvas.width*1.5/8.5;

//draw zone 2 rect
context.fillStyle = "#ffe381";
context.fillRect(left+1, (canvas.height*5/6)+1, canvas.width*2.75/8.5, canvas.height*1/6);

left = left + canvas.width*2.75/8.5 + 1;

//draw zone 3 rect
context.fillStyle = "#fbbd36";
context.fillRect(left+1, (canvas.height*5/6)+1, canvas.width*1.25/8.5, canvas.height*1/6);

left = left + canvas.width*1.25/8.5;

//draw target zone rect
context.fillStyle = "#004880";
context.fillRect(left+1, (canvas.height*5/6)+1, canvas.width*0.25/8.5, canvas.height*1/6);

left = left + canvas.width*0.25/8.5;
    
//draw zone 4 rect
context.fillStyle = "#f8961d";
context.fillRect(left+1, (canvas.height*5/6)+1, canvas.width*1.25/8.5, canvas.height*1/6);

left = left + canvas.width*1.25/8.5 + 1;

//draw zone 5 rect
context.fillStyle = "#8a1002";
context.fillRect(left+1, (canvas.height*5/6)+1, canvas.width-left, canvas.height*1/6);

////////////////
////  TEXT  ////
////////////////

//user name
context.fillStyle = "black";
context.font = "bold 18px sans-serif";
context.textAlign = 'right';
context.fillText("User Name", canvas.width, canvas.height*.05);

//AT:
context.font = "bold 12px sans-serif";
context.fillText("AT: 140", canvas.width, canvas.height*.1);

//AB:
context.fillText("AB: 94", canvas.width, canvas.height*.15);
       
//this part is done after the callback from the view adapter, but is relevant here to add the view back into the layout.
var parent = document.getElementById("layout-content");
parent.appendChild(canvas);
<div id="layout-content"></div>

私が見ている結果 ( サファリ で)見ている結果は、Fiddle で示されているよりもずっと歪んでいます。

私の場合

フィドル

私は何を間違えているのでしょうか?テキスト要素ごとに別々のキャンバスが必要なのでしょうか?フォントのせいでしょうか?HTML5 レイアウトで最初に canvas を定義する必要がありますか?タイプミスがあるのでしょうか?私は迷っています。

どのように解決するのですか?

canvas 要素は、デバイスやモニターのピクセル比率に依存せずに動作します。

iPad 3+ では、この比率は 2 です。 これは本質的に、1000px の幅の canvas が、iPad ディスプレイで指定された幅と一致するように、2000px を埋める必要があることを意味します。 幸いなことに、この処理はブラウザが自動的に行います。 一方、画像やキャンバスの要素が表示領域に直接収まるように作られているにもかかわらず、精細感が損なわれるのは、このためです。 canvas は 1000px を埋める方法しか知らないのに、2000px に描画するよう求められたため、ブラウザは要素を適切なサイズで表示するために、ピクセル間の空白をインテリジェントに埋めなければならなくなったのです。

を読むことを強くお勧めします。 この記事 から HTML5Rocks で、高解像度の要素を作成する方法について詳しく説明しています。

tl;dr? これは、私が自分のプロジェクトで使用している、適切な解像度のキャンバスを作成するための例です (上記のチュートリアルに基づいています)。

var PIXEL_RATIO = (function () {
    var ctx = document.createElement("canvas").getContext("2d"),
        dpr = window.devicePixelRatio || 1,
        bsr = ctx.webkitBackingStorePixelRatio ||
              ctx.mozBackingStorePixelRatio ||
              ctx.msBackingStorePixelRatio ||
              ctx.oBackingStorePixelRatio ||
              ctx.backingStorePixelRatio || 1;

    return dpr / bsr;
})();


createHiDPICanvas = function(w, h, ratio) {
    if (!ratio) { ratio = PIXEL_RATIO; }
    var can = document.createElement("canvas");
    can.width = w * ratio;
    can.height = h * ratio;
    can.style.width = w + "px";
    can.style.height = h + "px";
    can.getContext("2d").setTransform(ratio, 0, 0, ratio, 0, 0);
    return can;
}

//Create canvas with the device resolution.
var myCanvas = createHiDPICanvas(500, 250);

//Create canvas with a custom resolution.
var myCustomCanvas = createHiDPICanvas(500, 200, 4);

これが役に立つといいのですが