2011-12-05 15 views

答えて

7

キャンバスのAPIのようなもののために、具体的な方法を合成している「だけのオリジナル画像で透明でないピクセルで描画します。」これは、画像データを乱すよりはるかに簡単です。 (今インライン画像付き)

帽子の先端@ WilliamVanRensselaerの最初のバイオリンに

jsFiddle

希望する合成操作はsource-inです。これは、「描いている画像の不透明なピクセルの上に塗りつぶしたい部分の不透明部分を描画する」ことを意味します。

HTML:

<a href="javascript:doIt()">paint non-transparent regions white</a><br> 
<canvas id="canvas" width="600" height="200"></canvas> 

Javascriptを:

var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"); 

imgSrc = "http://d.pr/Td69+"; 
var b = document.getElementsByTagName("body")[0]; 
var i = document.createElement("img"); 
i.src = imgSrc; 
i.style.setProperty("display", "none"); 
i.onload = function() { 
    ctx.drawImage(i, 0, 0); 
} 
b.appendChild(i); 

window.doIt = function() { 
    ctx.globalCompositeOperation = "source-in"; 

    ctx.fillStyle = "#ffffff"; 
    ctx.fillRect(0, 0, 600, 200); 
} 

reference

+2

+1画像データを混乱させる代わりに 'globalCompositeOperation'を使用します。これは、他の(完全に正しい)ソリューションよりも早くゴブでなければなりません。 – Phrogz

+2

これは完璧です、ellisbben! Phrogzが言及したように速いだけでなく、さまざまなシナリオでより適切になる原点のアクセス許可の問題も回避します。乾杯! –

0

ここであなたが始めるために何か:

は、ここで私は(明らかに、静止画像を使用して)欲しいものの例です。アルファがゼロでない場合、これは基本的にピクセルを白に変更しますが、必要に応じて変更することができます。

例:http://jsfiddle.net/Q27Qc/

var canvas = document.getElementById("canvas"), 
    ctx = canvas.getContext("2d"); 

// Put something on the canvas (can be an image) 
ctx.font = "100px Arial"; 
ctx.fillText("Google", 20, 130); 

// Get image data for part of the canvas (to see effects) 
var img = ctx.getImageData(20, 40, 80, 100), 
    imgData = img.data; 

// Loops through bytes and change pixel to white if alpha is not zero. 
for (var i = 0; i < imgData.length; i += 4) { 
    if (imgData[i + 3] !== 0) { 
     imgData[i] = 255; 
     imgData[i + 1] = 255; 
     imgData[i + 2] = 255; 
    } 
} 

// Draw the results 
ctx.putImageData(img, 20, 40); 
+0

白にしても、完全に透明なピクセルのRGBを設定しない理由。 (スキップしたり、テストを避ける方が速いかどうかをテストする必要があります)どういうわけか、@ellisbenがはるかに優れた解決策を持っていることを除いて、私は+1します。 – Phrogz

関連する問題