我正在尝试创建一个缩放图像工具,为此我将 matrix3d 与 glMAtrix https://glmatrix.net/一起使用
我有以下组件:
- 代表最终视图的画布(黑色)
- 画布内较小的可调整大小的矩形(红色)
- 画布后面的 div 内的图像(带有文本的蓝色),一开始与画布具有相同的位置和尺寸
这个想法是,当我调整红色矩形的大小后,我应该在最终视图中将图像从较小的矩形缩放到全屏,这是我第一次这样做,但是下次我尝试重新缩放它时翻译不好。
如果我释放红色矩形,则应该进行缩放,以便我可以看到红色矩形中的内容,完全在黑色矩形中。
这是我尝试过的:
_updateViewPortZoom () {
const imageRect = $('.crop-editor-image').get(0).getBoundingClientRect()
const zoomLevel = imageRect.width / this._cropRect.getScaledWidth()
const trans = this._getReversCordsImage({
x: -this._cropRect.left,
y: -this._cropRect.top
});
translateCurrentMatrix(trans)
scaleCurrentMatrix([zoomLevel, zoomLevel, 1])
}
_getReversCordsImage(point) {
const matrix = this.options.stylesBuilder.getCurrentMatrix(PREVIEW_SELECTOR)
const vec = glMatrix.vec3.fromValues(point.x, point.y, 0)
const invertedMatrix = glMatrix.mat4.create()
glMatrix.mat4.invert(invertedMatrix, matrix)
glMatrix.vec3.transformMat4(vec, vec, invertedMatrix)
return vec
}
顺便说一句,翻译和缩放是更深层次的组件,所以我嘲笑它们,但它们基本上是这样做的:
case constants.SCALE: {
const scaleMatrix = glMatrix.mat4.create();
glMatrix.mat4.scale(scaleMatrix, scaleMatrix, parameter);
glMatrix.mat4.multiply(matrix, scaleMatrix, matrix);
break
}
case constants.TRANSLATE: {
const translateMatrix = glMatrix.mat4.create();
glMatrix.mat4.translate(translateMatrix, translateMatrix, parameter);
glMatrix.mat4.multiply(matrix, translateMatrix, matrix);
break
}
我的想法是尝试将红色矩形的左上点转换为图像坐标,然后进行平移和缩放。
关于如何使用matrix3d以不同方式执行此操作的任何想法?或者,如果您知道一些我可以看到如何缩放到矩形的示例。谢谢。