gpt4 book ai didi

javascript - 如何在 Canvas 对象中保持图像的纵横比

转载 作者:行者123 更新时间:2023-11-30 17:49:45 25 4
gpt4 key购买 nike

关于纵横比的快速问题让我有点抓狂。我的 Canvas 元素具有 250x250(1:1 比例)的固定尺寸。然而,我绘制到 Canvas 中的图像可能是任何尺寸/比例。显然,如果我试图强制图像为 250x250,它看起来会变形。

我试图让它符合纵横比,但我现在在 Canvas 对象中发现了一个奇怪的重叠,因此我的悬停效果有点不对劲。我的数学要么是错误的,要么是我将它应用到图像/ Canvas 上的方式是错误的。任何帮助或建议将不胜感激。

http://jsfiddle.net/Ra9KQ/1/

var NameSpace = NameSpace || {};

NameSpace.Pixelator = (function() {

var _cache = {
'wrapper' : null,
'canvas' : null,
'ctx' : null,
'img' : new Image()
},

_config = {
'canvasWidth' : 250,
'canvasHeight' : 250,
'isPlaying' : false,
'distortMin' : 3,
'distortMax' : 100,
'distortValue' : 100, // matches distortMax by default
'initDistortValue' : 3,
'speed' : 2.5,
'delta' : 2.5, // delta (+/- step), matches speed by default
'animation' : null,
'origImgWidth' : null,
'origImgHeight' : null,
'imgHeightRatio' : null,
'imgWidthRatio' : null,
'newImgWidth' : null,
'newImgHeight' : null
},

_init = function _init() {

_setupCache();
_setupCanvas();
_setupImage();

},

_setupCache = function _setupCache() {

_cache.wrapper = $('#dummy-wrapper');
_cache.canvas = document.getElementById('dummy-canvas');
_cache.ctx = _cache.canvas.getContext('2d');

},

_setupCanvas = function _setupCanvas() {

_cache.ctx.mozImageSmoothingEnabled = false;
_cache.ctx.webkitImageSmoothingEnabled = false;
_cache.ctx.imageSmoothingEnabled = false;

},

_setupImage = function _setupImage() {

$(_cache.img).on('load', function() {

_adjustImageScale();
_pixelate();
_assignEvents();

});

_cache.img.src = _cache.canvas.getAttribute('data-src');

},

_adjustImageScale = function _adjustImageScale() {

var scaledHeight,
scaledWidth;

_config.origImgWidth = _cache.img.width;
_config.origImgHeight = _cache.img.height;
_config.imgHeightRatio = _config.origImgHeight / _config.origImgWidth;
_config.imgWidthRatio = _config.origImgWidth / _config.origImgHeight;

scaledHeight = Math.round(250 * _config.imgHeightRatio);
scaledWidth = Math.round(250 * _config.imgWidthRatio);

if (scaledHeight < 250) {

_config.newImgHeight = 250;
_config.newImgWidth = Math.round(_config.newImgHeight * _config.imgWidthRatio);

} else if (scaledWidth < 250) {

_config.newImgWidth = 250;
_config.newImgHeight = Math.round(_config.newImgWidth * _config.imgHeightRatio);

}

},

_assignEvents = function _assignEvents() {

_cache.wrapper.on('mouseenter', _mouseEnterHandler);
_cache.wrapper.on('mouseleave', _mouseLeaveHandler);

},

_mouseEnterHandler = function _mouseEnterHandler(e) {

_config.delta = -_config.speed;

if (_config.isPlaying === false) {
_config.isPlaying = true;
_animate();
}

},

_mouseLeaveHandler = function _mouseLeaveHandler(e) {

_config.delta = _config.speed;

if (_config.isPlaying === false) {
_config.isPlaying = true;
_animate();
}

},

_pixelate = function _pixelate(val) {

var size = val ? val * 0.01 : 1,
w = Math.ceil(_config.newImgWidth * size),
h = Math.ceil(_config.newImgHeight * size);

_cache.ctx.drawImage(_cache.img, 0, 0, w, h);

_cache.ctx.drawImage(_cache.canvas, 0, 0, w, h, 0, 0, _config.canvasWidth, _config.canvasHeight);

},

_animate = function _animate() {

// increase/decrese with delta set by mouse over/out
_config.distortValue += _config.delta;

if (_config.distortValue >= _config.distortMax || _config.distortValue <= _config.distortMin) {

_config.isPlaying = false;
cancelAnimationFrame(_config.animation);
return;

} else {

// pixelate
_pixelate(_config.distortValue);
_config.animation = requestAnimationFrame(_animate);

}

};

return {
init: _init
};

})();

NameSpace.Pixelator.init();

最佳答案

您的代码将非正方形的 w*h 区域采样到正方形的 _config.canvasWidth*_config.canvasHeight 区域中。以下更改似乎为我修复了您的示例:

// old code
_cache.ctx.drawImage(_cache.canvas, 0, 0, w, h, 0, 0, _config.canvasWidth, _config.canvasHeight);
// new code
_cache.ctx.drawImage(_cache.canvas, 0, 0, w, h, 0, 0, _config.newImgWidth, _config.newImgHeight);

关于javascript - 如何在 Canvas 对象中保持图像的纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com