React-cropper - cropBox 不在图像中
React-cropper - cropBox is out of the image
我在当前项目中使用最新的 cropper.js 反应包 react-cropper,但我迷路了。问题是,裁剪区域可以超出图像范围,这是不应该的。我已经尝试了我能想到的一切。
这里是 _crop 方法,在 cropper 每次发生变化时调用。
componentDidMount = () => {
sessionStorage.setItem('shouldMove', false)
}
_crop = ( e ) => {
var canvasData = document.getElementsByClassName('cropper-hidden')
[0].cropper.canvasData
var cropBoxData = this.refs.cropper.getCropBoxData();
if ( sessionStorage.getItem('shouldMove') === 'false' ) {
sessionStorage.setItem( 'currentLeft', cropBoxData.left )
sessionStorage.setItem( 'currentTop', cropBoxData.top )
sessionStorage.setItem('shouldMove', true)
}else {
if (
cropBoxData.left <= canvasData.left ||
cropBoxData.top <= canvasData.top ||
cropBoxData.left + cropBoxData.width > canvasData.width +
canvasData.left ||
cropBoxData.top + cropBoxData.height > canvasData.height +
canvasData.top
) {
cropBoxData.left = sessionStorage.getItem( 'currentLeft' )
cropBoxData.top = sessionStorage.getItem( 'currentTop' )
}
}}
//render
<Cropper
ref='cropper'
src={URL.createObjectURL(this.props.image)}
aspectRatio={this.props.template.aspect_ratio}
guides={true}
zoomTo={ this.state.zoomValue }
dragMode="move"
crop={this._crop}
/>
我知道这是 sessionStorage 的噩梦,但我不能使用状态,因为它会重置整个裁剪器。我也从图像标签中获取 canvasData,因为 cropper.canvasData() 函数在这个反应包中不起作用。
在我上面的代码中,react 能够检测到裁剪区域在图像之外,但我不知道我应该在那里做什么。我试图将裁剪区域的位置设置为图像外部的第一个位置。但是数据没有变化。
哇。好吧,如果有人会遇到同样的问题,答案很简单,但我真的找不到任何地方。
只需将 viewMode 设置为“2”,如下所示:
<Cropper
ref='cropper'
src={this.props.image}
aspectRatio={ar}
guides={true}
zoomTo={ this.state.zoomValue }
dragMode="move"
crop={this._crop}
viewMode = {2} <-----
/>
它会起作用。
我在当前项目中使用最新的 cropper.js 反应包 react-cropper,但我迷路了。问题是,裁剪区域可以超出图像范围,这是不应该的。我已经尝试了我能想到的一切。
这里是 _crop 方法,在 cropper 每次发生变化时调用。
componentDidMount = () => {
sessionStorage.setItem('shouldMove', false)
}
_crop = ( e ) => {
var canvasData = document.getElementsByClassName('cropper-hidden')
[0].cropper.canvasData
var cropBoxData = this.refs.cropper.getCropBoxData();
if ( sessionStorage.getItem('shouldMove') === 'false' ) {
sessionStorage.setItem( 'currentLeft', cropBoxData.left )
sessionStorage.setItem( 'currentTop', cropBoxData.top )
sessionStorage.setItem('shouldMove', true)
}else {
if (
cropBoxData.left <= canvasData.left ||
cropBoxData.top <= canvasData.top ||
cropBoxData.left + cropBoxData.width > canvasData.width +
canvasData.left ||
cropBoxData.top + cropBoxData.height > canvasData.height +
canvasData.top
) {
cropBoxData.left = sessionStorage.getItem( 'currentLeft' )
cropBoxData.top = sessionStorage.getItem( 'currentTop' )
}
}}
//render
<Cropper
ref='cropper'
src={URL.createObjectURL(this.props.image)}
aspectRatio={this.props.template.aspect_ratio}
guides={true}
zoomTo={ this.state.zoomValue }
dragMode="move"
crop={this._crop}
/>
我知道这是 sessionStorage 的噩梦,但我不能使用状态,因为它会重置整个裁剪器。我也从图像标签中获取 canvasData,因为 cropper.canvasData() 函数在这个反应包中不起作用。
在我上面的代码中,react 能够检测到裁剪区域在图像之外,但我不知道我应该在那里做什么。我试图将裁剪区域的位置设置为图像外部的第一个位置。但是数据没有变化。
哇。好吧,如果有人会遇到同样的问题,答案很简单,但我真的找不到任何地方。 只需将 viewMode 设置为“2”,如下所示:
<Cropper
ref='cropper'
src={this.props.image}
aspectRatio={ar}
guides={true}
zoomTo={ this.state.zoomValue }
dragMode="move"
crop={this._crop}
viewMode = {2} <-----
/>
它会起作用。