有一些工具可以使用 HTML5 的画布和 ImageMagick。以下是我将如何实施解决方案。
显示上传的图片,顶部带有canvas 元素。使用 javascript 匹配宽度和高度,并绑定事件侦听器以收集鼠标移动。
var MyDrawing = {
// A new drawing event. Init points & start canvas path (for feedback)
"start" : function(evt) {
var point = [evt.layerX, evt.layerY];
var ctx = this.getContext("2d");
ctx.beginPath();
ctx.lineWidth = "2";
ctx.strokeStyle = "red";
ctx.moveTo(point[0], point[1]);
this.points = [point];
},
"update" : function(evt) {
if(this.points) {
this.getContext("2d").lineTo([evt.layerX, evt.layerY]);
this.points.push([evt.layerX, evt.layerY]); // Collect latest point
}
},
"end" : function(evt) {
var ctx = this.getContext("2d");
ctx.lineTo(evt.layerX, evt.layerY);
ctx.closePath();
ctx.stroke();
this.points.push([evt.layerX, evt.layerY])
// Send points to server via ajax
myAjaxFunctionHere(this.points);
}
}
var c = document.getElementById("canvas");
c.addEventListener("mousedown", MyDrawing.start, false);
c.addEventListener("mousemove", MyDrawing.update, false);
c.addEventListener("mouseup", MyDrawing.end, false);
不是最好的,但它会给用户一些反馈。
在后端,将给定点归一化为 (x,y) 关联元组的列表。
// Example of what ImagickDraw is expecting.
$points = array(
array('x' => 193, 'y' => 103),
array('x' => 192, 'y' => 102),
// ....
);
此时,您可以绘制一个图像蒙版,并将其应用于带有Imagick::compositeImage 的图像。或者使用Chroma Key 颜色直接在图像上绘制并切换为透明度。
$img = new Imagick('/path/to/uploaded/image.png'); // Load image
$chromaKey = new ImagickPixel('#6BFD00'); // Define Chroma
$draw = new ImagickDraw(); //
$draw->setFillColor($chromaKey); // Fill with Chroma
$draw->polygon($points); // Draw Point
$img->drawImage($draw); // Apply to image
$img->paintTransparentImage($chromaKey, 0.0, 0.1); // Swap Chroma with transparent
$img->writeImage('/path/to/generated/image.png'); // Save to disk