在 Javascript 中使用 X、Y 坐标裁剪图像

Posted

技术标签:

【中文标题】在 Javascript 中使用 X、Y 坐标裁剪图像【英文标题】:Crop image with X, Y coordinates in Javascript 【发布时间】:2016-03-17 20:58:22 【问题描述】:

我正在尝试用X and Y 坐标和width and height. 裁剪dataURL 图像 我不想调整图像大小。我只想获取区域 (x,y) 以及宽度和高度。 我已经在 php 中完成了此操作,但现在我正在尝试在 JS 中执行此操作。这是我的实际代码:

function resizeImage(url, width, height, x, y, callback) 
var canvas = document.createElement("canvas");
      var context = canvas.getContext('2d');
      var imageObj = new Image();

      imageObj.onload = function() 
        var sourceX = 0;
        var sourceY = 0;
        var sourceWidth = imageObj.width;
        var sourceHeight = imageObj.height;
        var destWidth = width;
        var destHeight = height;
        var destX = x;
        var destY = y;

        context.drawImage(imageObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight);
        callback(canvas.toDataURL())
      ;
      imageObj.src = url;

这个函数只是改变宽度和高度,这不是它应该做的结果。

这是我的PHP 代码(如果有助于更好地了解我)

<?php
class Cropper 
    var $x;
    var $y;
    var $dataURL;
    var $width;
    var $height;
    var $filter;
    function __construct($x, $y, $dataURL, $width, $height, $filter) 
        $this->x = $x;
        $this->y = $y;
        $this->dataURL = $dataURL;
        $this->width = $width;
        $this->height = $height;
        $this->filter = $filter;
    
    function setHeader() 
        header('Content-Type: image/png');
    
    function Render() 
        $image = $this->dataURL;
        $image = substr($image, 22);
        $img = imagecreatetruecolor(340, 462);
        $org_img = imagecreatefromstring(base64_decode($image));
        imagecopy($img, $org_img, 0, 0, $this->x, $this->y, $this->width, $this->height);
        if($this->filter == 1) imagefilter($img, IMG_FILTER_GRAYSCALE);
        if($this->filter == 2) 
            imagefilter($img,IMG_FILTER_GRAYSCALE);
            imagefilter($img,IMG_FILTER_COLORIZE,100,50,0);
        
        ob_start(); 
            imagepng($img);
            imagealphablending($img,true);
            $image_data = ob_get_contents(); 
        ob_end_clean(); 
        $image_data_base64 = base64_encode($image_data);
        imagedestroy($img);
        return 'data:image/png;base64,'.$image_data_base64;
    

?>

为了更好地理解我,我还画了一张:

编辑:抱歉,在 X 和 Y 之间取反

所以函数需要返回黄色区域 我怎样才能做到这一点?我的代码有什么问题?谢谢

【问题讨论】:

您是否尝试过类似:github.com/fengyuanchen/cropper 或者您是否尝试自己编写? 我正在尝试自己编写。不想为此使用 lib 【参考方案1】:

防止失真的关键似乎是设置画布元素的宽度和高度。然后,我对源和目标使用了所需的裁剪或 destination 宽度和高度,然后使用 0、0 作为子矩形的起始 x、y 坐标,或裁剪 destination 图片:

function resizeImage(url, width, height, x, y, callback) 
    var canvas = document.createElement("canvas");
    var context = canvas.getContext('2d');
    var imageObj = new Image();

    // set canvas dimensions

    canvas.width = width;
    canvas.height = height;

    imageObj.onload = function () 
        context.drawImage(imageObj, x, y, width, height, 0, 0, width, height);
        callback(canvas.toDataURL());
    ;

    imageObj.src = url;

编辑

有趣的发现:除了裁剪之外,您还可以使用它为图像添加填充。

var padding = 10,
    sourceImgWidth = 150,
    sourceImgHeight = 100,
    paddedWidth = sourceImgWidth + padding * 2,
    paddedHeight = sourceImgHeight + padding * 2,
    x = -padding,
    y = -padding;

resizeImage('test.jpg', paddedWidth, paddedHeight, x, y, function (dataURL) 
    paddedImage.src = dataURL;
);

【讨论】:

【参考方案2】:

根据CanvasRenderingContext2D.drawImage() 函数的文档:

ctx.drawImage(图像, sx, sy, sWidth, sHeight, dx, dy, dWidth, d高度);

sx, sy, sWidth, sHeight 是源图子矩形的参数 在您的情况下:参数 sx, sy, sWidth, sHeight 应与参数 dx, dy, dWidth, dHeight 一致(在最简单的情况下) 更改您的 imageObj.onload 处理程序,如下所示:

...
imageObj.onload = function() 
   context.drawImage(imageObj, x, y, width, height, x, y, width, height);
   callback(canvas.toDataURL())
;
...

【讨论】:

这不会裁剪图像。 @toomanyredirects,你能证明这一点吗? (你看到 developer.mozilla.org/ru/docs/Web/API/CanvasRenderingContext2D/… 的 jsfiddle 例子了吗?

以上是关于在 Javascript 中使用 X、Y 坐标裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

根据 Revit 坐标(最小和最大 X、Y、Z)从锻造查看器中裁剪特定房间/区域

ArcGIS + Python 批量裁剪添加X/Y坐标脚本

如何获取裁剪图像相对于原始图像的坐标?

如何指定 X、Y、宽度和高度以便在 Photoshop 中进行裁剪?

python pillow

使用 javascript 在 x/y 坐标处模拟点击