gpt4 book ai didi

javascript - 使用 kineticjs 在 Canvas 上创建覆盖并删除部分覆盖

转载 作者:行者123 更新时间:2023-11-29 10:45:49 24 4
gpt4 key购买 nike

在 Canvas 绘画应用程序中,我想添加功能以在整个 Canvas 上创建覆盖,然后当我在 Canvas 上制作一个特定的矩形时,覆盖应该从该区域移除,就像 https://onpaste.com/ 上的一样(选择焦点工具)。我的想法是,如果在 Canvas 上制作了一个矩形,那么我可以裁剪当前图像,然后将图像再次粘贴到 Canvas 上,覆盖在所选位置的叠加层上。我不确定,如何在将图像粘贴到 Canvas 上之前裁剪图像,我尝试使用 Kinetic.Image 对象的方法 setFillPaternImage ,但在这里我想提供 Kinetic.Image 对象而不是 javascript 图像对象,因为在 Kinetic.Image 对象上我可以使用 setAttrs 方法。请告诉我如何裁剪和添加图像,或者是否有更好的方法来实现相同的效果。链接到 fiddle -> http://jsfiddle.net/hearsid/9a2Hn/

<html>
<head>
<style>


</style>
</head>

<body>


<div id="container"></div>

<button id="button">this</button>
<script src="js/jquery.js"></script>
<script src="js/kinetic.js"></script>
<script>

var stage = new Kinetic.Stage({
container:'container',
width:500,
height:300
});

var layer=new Kinetic.Layer();


var img = new Image();
img.onload = function() {

imgObj = new Kinetic.Image({
x:0,y:0,width:400,height:300,image:img
});

layer.add(imgObj);


var circle = new Kinetic.Circle({
x:30,y:30,radius:30,fill:'red'
});

layer.add(circle);

var rect = new Kinetic.Rect({
x:0,y:0,width:300,height:500,fill:'gray',opacity:0.5
});

layer.add(rect);

stage.add(layer);
}
img.src="some.jpg";

$("#button").click(function() {

rect2 = new Kinetic.Rect({
x:200,y:30,width:100,height:100
});

/*
Careful with the commented area , here I wanted to crop the image before using FillPaternImage
var img2 = new Image();
img2.onload = function() {
imgObj2 = new Kinetic.Image({
image: img2 ,
x:300
});
imgObj2 = imgObj.clone();
imgObj2.setAttrs({image :img2 ,x:100 , y:0 });
*/

img2 = img ;

rect2.setFillPatternImage(img2);
layer.add(rect2);
layer.draw();

});



</script>


</body>
</html>

最佳答案

您的“剪辑显示”可以这样完成:

演示:http://jsfiddle.net/m1erickson/qXHAJ/

enter image description here

在底层:

  • 添加图片。
  • 添加半透明 Rect 以“磨砂”底部图像。

在叠加层中:

  • 将组添加到顶部叠加层。
  • 将组的剪辑属性设置为您想要显示的区域。

群内:

  • 再次添加图像(第二张图像将仅在组剪辑区域“显示”)。
  • 添加一个可拖动的矩形作为您的“ View ”
  • (Rect 将其 X/Y/宽度/高度设置为组剪辑区域。

当用户拖动 Rect 时:

  • 将组的剪切区域更改为 Rect 的 X/Y。
  • Rect 将作为显示位置的可拖动指示器。

结果是除了可拖动的 Rect 之外,图像在任何地方都被“磨砂”。

这是代码和 fiddle :http://jsfiddle.net/m1erickson/qXHAJ/

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.2.min.js"></script>

<style>
body{padding:20px;}
#container{
border:solid 1px #ccc;
margin-top: 10px;
width:300px;
height:300px;
}
</style>
<script>
$(function(){

var stage = new Kinetic.Stage({
container: 'container',
width: 300,
height: 300
});
var layer = new Kinetic.Layer();
var frostlayer=new Kinetic.Layer();
stage.add(layer);
stage.add(frostlayer);

var view;

var img=new Image();
img.onload=function(){
start();
}
//img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/KoolAidMan.png";
img.src="KoolAidMan.png";


function start(){

var image=new Kinetic.Image({
image:img,
x:0,
y:0,
width:300,
height:300
});
layer.add(image);

var frost=new Kinetic.Rect({
x:0,
y:0,
width:300,
height:300,
fill:"white",
opacity:0.70
});
layer.add(frost);

var viewport=new Kinetic.Group({
x:0,
y:0,
width:300,
height:300,
clip:[30,30,100,100]
});
frostlayer.add(viewport);

unfrosted=new Kinetic.Image({
image:img,
x:0,
y:0,
width:300,
height:300
});
viewport.add(unfrosted);

view=new Kinetic.Rect({
x:30,
y:30,
width:100,
height:100,
strokeWidth:3,
stroke:"purple",
draggable:true
});
view.on("dragmove",function(){
viewport.setClip(this.getX(),this.getY(),100,100);
});
viewport.add(view);

layer.draw();
frostlayer.draw();

}


}); // end $(function(){});

</script>
</head>

<body>
<h3>Drag the unfrosted Rect</h3>
<div id="container"></div>
</body>
</html>

关于javascript - 使用 kineticjs 在 Canvas 上创建覆盖并删除部分覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com