diff --git a/component/Cropper.js b/component/Cropper.js index a877b1e..4635a49 100644 --- a/component/Cropper.js +++ b/component/Cropper.js @@ -396,21 +396,32 @@ class Cropper extends Component { } // crop image - crop(){ + crop(maxWidth, maxHeight){ const {frameWidth, frameHeight, originX, originY, imgWidth} = this.state let canvas = document.createElement('canvas') let img = ReactDOM.findDOMNode(this.refs.img) - // crop accroding image's natural width + // crop accroding image's natural width const _scale = img.naturalWidth / imgWidth const realFrameWidth = frameWidth * _scale const realFrameHeight = frameHeight * _scale + // limit img by max crop size + const wishedWidth = maxWidth ? Math.min(maxWidth, realFrameWidth) : realFrameWidth + const wishedHeight = maxHeight ? Math.min(maxHeight, realFrameHeight) : realFrameHeight + + const squeezeRatio = wishedWidth / realFrameWidth + const flattenRatio = wishedHeight / realFrameHeight + const scaleRatio = Math.min(squeezeRatio, flattenRatio) + const realOriginX = originX * _scale const realOriginY = originY * _scale - canvas.width = frameWidth - canvas.height = frameHeight + const finalWidth = realFrameWidth * scaleRatio + const finalHeight = realFrameHeight * scaleRatio + + canvas.width = finalWidth + canvas.height = finalHeight - canvas.getContext("2d").drawImage(img, realOriginX, realOriginY, realFrameWidth, realFrameHeight, 0, 0, frameWidth, frameHeight) + canvas.getContext("2d").drawImage(img, realOriginX, realOriginY, realFrameWidth, realFrameHeight, 0, 0, finalWidth, finalHeight) return canvas.toDataURL() } diff --git a/demo/demo.js b/demo/demo.js index 42f512e..550e880 100644 --- a/demo/demo.js +++ b/demo/demo.js @@ -43,7 +43,6 @@ class ImageCropDemo extends Component { } handleChange(state, values){ - console.log(state, values) this.setState({ [state + 'Values']: values }); diff --git a/lib/Cropper.js b/lib/Cropper.js index 5d9eb0f..6a0f667 100644 --- a/lib/Cropper.js +++ b/lib/Cropper.js @@ -521,7 +521,7 @@ var Cropper = function (_Component) { }, { key: 'crop', - value: function crop() { + value: function crop(maxWidth, maxHeight) { var _state8 = this.state, frameWidth = _state8.frameWidth, frameHeight = _state8.frameHeight, @@ -532,16 +532,29 @@ var Cropper = function (_Component) { var canvas = document.createElement('canvas'); var img = ReactDOM.findDOMNode(this.refs.img); // crop accroding image's natural width + var _scale = img.naturalWidth / imgWidth; + console.log(img.naturalWidth); var realFrameWidth = frameWidth * _scale; var realFrameHeight = frameHeight * _scale; + console.log(realFrameWidth); + var wishedWidth = maxWidth ? Math.min(maxWidth, realFrameWidth) : realFrameWidth; + var wishedHeight = maxHeight ? Math.min(maxHeight, realFrameHeight) : realFrameHeight; + + var squeezeRatio = wishedWidth / realFrameWidth; + var flattenRatio = wishedHeight / realFrameHeight; + var scaleRatio = Math.min(squeezeRatio, flattenRatio); + var realOriginX = originX * _scale; var realOriginY = originY * _scale; - canvas.width = frameWidth; - canvas.height = frameHeight; + var finalWidth = realFrameWidth * scaleRatio; + var finalHeight = realFrameHeight * scaleRatio; + + canvas.width = finalWidth; + canvas.height = finalHeight; - canvas.getContext("2d").drawImage(img, realOriginX, realOriginY, realFrameWidth, realFrameHeight, 0, 0, frameWidth, frameHeight); + canvas.getContext("2d").drawImage(img, realOriginX, realOriginY, realFrameWidth, realFrameHeight, 0, 0, finalWidth, finalHeight); return canvas.toDataURL(); }