【问题标题】:html5 image croppinghtml5图片裁剪
【发布时间】:2012-04-24 15:32:44
【问题描述】:

我正在使用context-blender对html背景图像的前192个像素应用固定颜色的乘法效果,以实现页面标题的透明效果。

在 html 上,我有 2 个画布。一个用于应用乘法效果的图像部分,一个用于颜色。

在 javascript 上,在将颜色画布的颜色和两个画布的宽度设置为 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 来创建背景图像

编辑2:

我创建了一个fiddle 来说明问题。如果您取消注释 //cHeight *= magicConstant; 行,裁剪后的图像看起来会好很多,但事情不再有意义。我删除了提琴手的乘法效果,但这并不是重现问题所必需的。我还注意到,如果我从 URL 中删除第二个画布,行为会发生变化。

顺便说一句,这种行为发生在 google chrome 上,但我认为同样的事情发生在 safari 和 firefox 上。

【问题讨论】:

  • 你能在 jsfiddle.net 上创建一个例子吗?可能会帮助我们为您找到答案。此外,行为(获得 230 像素与 296 像素)在多个浏览器中是否一致?
  • @MarcGagne 我将示例添加到问题中

标签: javascript html canvas


【解决方案1】:

好的,我已经解决了。男人就是这么难!主要是因为你忘了设置 imageCanvas 的画布高度。图像有白色边框也无济于事。我花了很多时间试图弄清楚填充的来源。

首先,对于fiddle 的情况,在函数doBlending() 中设置imageCanvas.canvas.height = height;

那么crop()中的计算需要涵盖2种可能性。图像是按高度缩放并在左侧截断,还是按宽度缩放并在底部截断?我不会为你写这两个,但这是一个针对高度缩放的情况:

function crop(imageObj, imageCanvas, colorCanvas) {
    // Assumes bg image is scaled for hight
    var scale = imageObj.height / window.innerHeight; 
    var targetHeight = imageCanvas.canvas.height;
    var targetWidth = window.innerWidth;

    imageCanvas.drawImage(imageObj, 
                          0, 0, targetWidth * scale, targetHeight * scale,
                          0, 0, targetWidth, targetHeight);
}

我真的不知道你在你的例子中从哪里想出了比例因子。将通过将 x 和 y 维度乘以某个比例因子来缩放图像。这就是你如何保持纵横比。比例因子将是使图像的高度与窗口的高度相匹配的比例因子和使图像的宽度与窗口的宽度相匹配的比例因子中的较大者。

【讨论】:

  • 白色边框是因为小提琴(我认为)。在原始代码中,没有白色边框。这里的情况总是匹配背景图像的宽度并在底部截断以获得 192px 的高度。我想我确实把事情复杂化了很多。
  • 白色边框是存储在 bittbox 上的the image 的一部分。使用小提琴,如果结果区域的纵横比(宽度/高度)小于源图像的宽高比,则匹配宽度不起作用,因为cover 的工作方式。
【解决方案2】:

我认为在这里使用窗口内部尺寸可能对您无效。由于封面将保持背景图像的纵横比,这意味着它的两个尺寸可能都不会完全显示。因此,如果您尝试在纵横比之间进行转换以确定剪辑的位置,则必须考虑到图像可能会流出窗口边框的事实。

【讨论】:

  • 在我的代码中,我确保图像足够长,以便封面可以拉伸图像以匹配窗口宽度。然后我应用 3 个简单的规则来获取图像高度。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2010-12-03
相关资源
最近更新 更多