context-blenderを使用して、html background-image の最初の 192 ピクセルに乗算効果を適用し、固定色でページのヘッダーに透明効果を実現しています。
HTMLには2つのキャンバスがあります。1 つは乗算効果を適用するイメージの部分用で、もう 1 つは色用です。
javascript では、color-canvas の色と両方のキャンバスの幅を window.innerWidth に設定した後、次のように背景画像を取得しています。
imageObj.src = $('html').css('background-image').replace(/^url|[\(\)]/g, '');
ここで問題が発生します。乗算効果を適用できるように、切り抜いた画像を画像キャンバスに描画したいと考えています。私は次のことをしようとしています:
imageObj.onload = function(){
// getting the background-image height
var imageHeight = window.innerWidth * imageObj.height / imageObj.width;
// get the corresponding pixels of the source image that correspond to the first 192 pixels of the background-image
var croppedHeight = 192 * imageObj.height / imageHeight;
// draw the image to the canvas
imageCanvas.drawImage(imageObj, 0, 0, imageObj.width, croppedHeight, 0, 0, window.innerWidth, 192);
// apply the multiply effect
colorCanvas.blendOnto( imageCanvas, 'multiply');
}
しかし、トリミングされた高さを取得するのに何か間違っています。
例: 1536x1152 の画像と 1293x679 のブラウザー コンテナーの場合、ソースのトリミングされた高さの値は 230 ですが、適切なトリミングを取得するには 296 前後の値を使用する必要があります。
編集:
css で background-size: cover を使用して background-image を作成しています
編集2:
問題を説明するためにフィドルを作成しました。この行のコメントを外すと//cHeight *= magicConstant;
、トリミングされた画像の見栄えは良くなりますが、意味がなくなります。フィドラーの乗算効果を削除しましたが、問題を再現する必要はありません。URL から 2 番目のキャンバスを削除すると、動作が変わることにも気付きました。
ところで、この動作は google chrome で発生しましたが、safari と firefox でも同じことが起こると思います。