在画布中裁剪图像

Posted

技术标签:

【中文标题】在画布中裁剪图像【英文标题】:cropping a image in a canvas 【发布时间】:2019-06-15 07:27:57 【问题描述】:

我有一个大小为 300 像素到 300 像素的画布,我将一个非常大的图像拖放到上面。所以它需要画布的大小。然后我有一个可调整大小和可移动的正方形,用于裁剪某些区域。因此,使用 jquery 我获取裁剪正方形的宽度和高度以及到剪切点的 x 和 y 距离。但是当我最终裁剪并在第二个画布中显示该区域时,我可以看到裁剪区域与我选择的要裁剪区域不完全相同。

我不想使用 getimagedata 和 putimagedata 命令。我只想使用 drawimage 命令

请帮忙

var x = $("#crop_square").width();
var y = $("#crop_square").height();

var ty = $("#crop_square").offset().top - $("#area_c").offset().top;
var tx = $("#crop_square").offset().left - $("#area_c").offset().left;


var c =  document.getElementById("area_c");
var c2 =  document.getElementById("area_c2");

var ctx = c.getContext("2d");
var ctx2 = c2.getContext("2d");

ctx2.drawImage(image_src,tx,ty,x, y,0,0,c2.width,c2.height);




 <canvas id ="area_c" style="width:300px;height:300px;border:3px solid black;z-index:1"  ondrop="dropb(event)"  ondragover="myfkb(event)"   >
 </canvas>

 <canvas  id ="area_c2" style="width:300px;height:300px;border:3px solid black;z-index:1"  >

  </canvas>

【问题讨论】:

Crop an image displayed in a Canvas的可能重复 不是。我提到了堆栈溢出问题。它使用 getImagedata 。我不想用那个。我只是想只使用绘制图像命令。另外我的问题是裁剪正方形尺寸与裁剪区域不匹配 尝试使用ctx2.drawImage(image_src,tx,ty,x, y,0,0,c2.width,c2.height);,而不是ctx2.drawImage(c,tx,ty,x, y,0,0,c2.width,c2.height); 我认为问题是裁剪正方形尺寸与图像不匹配,因为它的压缩大小 很可能offset() 不会返回您所期望的,因为您有 DOM 元素嵌套。您应该创建一个小提琴并展示您的问题。 【参考方案1】:

不要从 tx,ty 中减去 area_c top 和 left 试试这个

var x = $("#crop_square").width();
var y = $("#crop_square").height();

var ty = $("#crop_square").offset().top;
var tx = $("#crop_square").offset().left;


var c =  document.getElementById("area_c");
var c2 =  document.getElementById("area_c2");

var ctx = c.getContext("2d");
var ctx2 = c2.getContext("2d");

ctx2.drawImage(image_src,tx,ty,x, y,0,0,c2.width,c2.height);

【讨论】:

它不会被绘制出来

以上是关于在画布中裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

jquery - 用“cropper”裁剪图像 - 在画布中

使用 JCrop 将图像裁剪到画布中

Fabric JS clipPath:裁剪后如何使图像适合画布?

画布裁剪图像 Android

javascript将图像裁剪到画布

使用 FabricJs 在同一画布上裁剪多个图像