Cropper 旋转裁剪拉伸放大变形

使用Cropper v3.1.6裁剪图片时发现旋转图片后裁剪,裁剪出来的图片拉伸放大变形了。
我想要旋转后裁剪出来的图片不拉伸放大变形,还望各位大咖不吝赐教啊

img


上面的图片是旋转裁剪区域

img


上面的图片是裁剪后的图片

在裁剪方法里面改变宽高的属性,就能限制裁剪后图片的大小

参考chatGPT的内容和自己的思路,Cropper 是一个基于 JavaScript 的图片裁剪工具,它允许你在前端页面上对图片进行裁剪、旋转、缩放等操作。在使用 Cropper 进行旋转后裁剪时,如果裁剪出来的图片拉伸放大变形了,可能是因为裁剪框的宽高比与旋转后的图片宽高比不匹配导致的。

为了解决这个问题,你可以尝试以下几种方法:

1.设置裁剪框的宽高比
在调用 Cropper 的时候,可以通过设置裁剪框的宽高比来保持裁剪框的比例和旋转后的图片比例一致。例如,如果你希望裁剪框的宽高比为 1:1,可以在初始化 Cropper 的时候设置:

var cropper = new Cropper(document.getElementById('image'), {
  aspectRatio: 1 / 1
});

Cropper 是一个基于 JavaScript 的图片裁剪工具,它允许你在前端页面上对图片进行裁剪、旋转、缩放等操作。在使用 Cropper 进行旋转后裁剪时,如果裁剪出来的图片拉伸放大变形了,可能是因为裁剪框的宽高比与旋转后的图片宽高比不匹配导致的。

为了解决这个问题,你可以尝试以下几种方法:

设置裁剪框的宽高比
在调用 Cropper 的时候,可以通过设置裁剪框的宽高比来保持裁剪框的比例和旋转后的图片比例一致。例如,如果你希望裁剪框的宽高比为 1:1,可以在初始化 Cropper 的时候设置:

var cropper = new Cropper(document.getElementById('image'), {
  aspectRatio: 1 / 1
});

2.调整裁剪框位置
如果裁剪框的宽高比和旋转后的图片比例不匹配,你可以尝试调整裁剪框的位置,使得需要裁剪的部分完全包含在裁剪框内,从而避免拉伸和变形。你可以通过调整裁剪框的左上角坐标和宽高来实现:

cropper.setCropBoxData({
  left: x,
  top: y,
  width: w,
  height: h
});


其中 x、y、w、h 分别为裁剪框的左上角坐标和宽高。

希望能帮助到你,回答不易还请采纳!!!

“Devil组”引证GPT后的撰写:
要解决这个问题,你可以尝试以下几种方法:

  • 使用“限制比例”选项:在Cropper的配置中,有一个“aspectRatio”选项,它可以限制裁剪框的宽高比例。你可以根据旋转后的图片大小设置合适的宽高比例,这样就可以防止裁剪框的拉伸变形了。
  • 调整图片尺寸:如果旋转后的图片大小与原始图片相比发生了很大的变化,你可以尝试调整图片的尺寸,让它们保持一致。你可以使用JavaScript或其他工具来实现这个功能。
  • 使用CSS3变换:在Cropper的配置中,有一个“rotateTo”选项,它可以直接旋转图片。你可以使用CSS3的变换功能来实现旋转,并保持图片的尺寸不变。例如,你可以使用“transform-origin”属性来设置旋转中心,避免图片发生位移。

参考gpt和自己的思路,您遇到的问题可能是由于旋转操作引起的图像尺寸变化导致的。当您旋转图像时,它的宽度和高度可能会发生变化。如果您接下来对旋转后的图像进行裁剪,它可能会被拉伸或扭曲以适应裁剪后的大小。

为了解决这个问题,您可以尝试使用以下方法:

使用图像编辑软件:打开旋转后的图像,选择“图像大小”或“画布大小”选项,然后将图像大小调整为与原始图像相同。您可以使用Photoshop、GIMP等图像编辑软件来完成此操作。
使用Python或其他编程语言:使用Python的PIL或OpenCV库等图像处理库,可以在代码中实现旋转和裁剪操作。在旋转图像之后,您可以使用库中的函数来调整图像的大小,以确保其与原始图像的尺寸相同。以下是一个示例代码:


import cv2

# 读取旋转后的图像
img = cv2.imread('rotated_image.jpg')

# 获取原始图像的尺寸
original_size = (500, 500)  # 假设原始图像大小为500x500像素

# 调整旋转后的图像大小
resized_img = cv2.resize(img, original_size)

# 对图像进行裁剪
cropped_img = resized_img[100:300, 200:400]  # 假设需要裁剪的大小为200x200像素

# 保存裁剪后的图像
cv2.imwrite('cropped_image.jpg', cropped_img)


以上是一些可能的解决方案。希望能帮助到您解决问题!

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
您好,问题可能是由于旋转后的图像宽高比与原图不一致导致的。解决方法是在旋转图像后,将其缩放至裁剪区域大小再进行裁剪,裁剪出来的图像将不会变形。

以下是使用Cropper v3.1.6实现旋转后裁剪不变形的示例代码:

<!DOCTYPE html>
<html>
<head>
    <title>Cropper旋转裁剪不变形示例</title>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/cropperjs/1.5.11/cropper.min.css">
</head>
<body>
    <div>
        <img id="image" src="https://dl.airtable.com/.attachmentThumbnails/96cfad9d9c20444a6c11a45faec28a81/cd6d75f6" alt="image">
    </div>
    <div>
        <button id="rotate-left-btn">向左旋转</button>
        <button id="rotate-right-btn">向右旋转</button>
        <button id="crop-btn">裁剪</button>
    </div>
    <div>
        <canvas id="canvas"></canvas>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/cropperjs/1.5.11/cropper.min.js"></script>
    <script>
        const image = document.getElementById('image');
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        const cropper = new Cropper(image, {
            aspectRatio: 16 / 9,
            movable: false,
            zoomable: false,
            rotatable: true,
            guides: false,
            cropBoxResizable: false,
            cropBoxMovable: false
        });
        document.getElementById('rotate-left-btn').addEventListener('click', function () {
            cropper.rotate(-90);
        });

        document.getElementById('rotate-right-btn').addEventListener('click', function () {
            cropper.rotate(90);
        });

        document.getElementById('crop-btn').addEventListener('click', function () {
            const croppedCanvas = cropper.getCroppedCanvas();
            const croppedImg = new Image();
            croppedImg.src = croppedCanvas.toDataURL();
            croppedImg.onload = function () {
                // 计算旋转后的缩放比例
                const rotatedWidth = (Math.abs(cropper.getData().rotate) / 90 % 2 === 0) ? croppedImg.width : croppedImg.height;
                const rotatedHeight = (Math.abs(cropper.getData().rotate) / 90 % 2 === 0) ? croppedImg.height : croppedImg.width;
                const scaleX = croppedCanvas.width / rotatedWidth;
                const scaleY = croppedCanvas.height / rotatedHeight;

                // 将旋转后的图像缩放至裁剪框大小再裁剪
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                canvas.width = cropper.getCropBoxData().width;
                canvas.height = cropper.getCropBoxData().height;
                ctx.drawImage(croppedImg, cropper.getData().x / scaleX, cropper.getData().y / scaleY, croppedImg.width / scaleX, croppedImg.height / scaleY, 0, 0, canvas.width, canvas.height);
                const croppedImageDataURL = canvas.toDataURL();
                console.log(croppedImageDataURL);
            };
        });
    </script>
</body>
</html>

注:需要注意图片的跨域问题,以上代码只是示例,具体实现仍需要根据实际情况调整。
如果我的回答解决了您的问题,请采纳!