Jump to content
  • 0

Обрезка изображения линиями


Katerina23
 Share

Question

Существует специальная функция которая рисует изображение drawImage и её перегруженный вариант которая делает обрезку изображения и принимает она 8 параметров.

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

Можно ли как ни-будь сделать обрезку изображения не таким способом, а с помощью линий (lineTo).
Вот сам код:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Загрузка картинки</title>
 
<script>
var canvas, ctx, img;
window.onload = function()
{
canvas = document.getElementById("drawingCanvas");
ctx = canvas.getContext("2d");
var img = new Image();
img.src = "img2.jpg";
img.onload = function()
{
   ctx.drawImage(img, 50, 50, 300, 200);
   ctx.beginPath();
   ctx.moveTo(50, 50);
   ctx.lineTo(150, 50);
   
   ctx.moveTo(150, 50);
   ctx.lineTo(150, 150);
   
   ctx.moveTo(150, 150);
   ctx.lineTo(50, 150);
   
   ctx.moveTo(50, 150);
   ctx.lineTo(50, 50);
   
   ctx.strokeStyle = "white";
   ctx.stroke();
}
}
</script>
</head>
<body>
<canvas id="drawingCanvas" style="background:#444444" width="400px" height="300px"></canvas><br>
</body>
</html>

В итоге получается вот, что 

img.jpg.0e04755c580ed6e0e5292870f60e8eef.jpg

Надо всю картинку убрать и оставить только в прямоугольной области.

P.S. Подобный пример в ActionScript делается с помощью масок, а в html 5 масок нет по крайне мере я не нашла не одной статьи где упоминались маски в html 5.

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

Теперь хочу сделать перемещение с помощью мыши. Но функция rect не перемещается а просто очищает указанную область.

Вот пример моего кода.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Загрузка картинки</title>
 
<script>
var canvas, ctx, img;
window.onload = function()
{

var img = new Image();
img.src = "img2.jpg";
var offsetX;
var offsetY;
var startX;
var startY;
var BB;
var x = 50;
var y = 50;
var dragok = false;


img.onload = function()
{
   
   canvas = document.getElementById("drawingCanvas");
   ctx = canvas.getContext("2d");
   BB = canvas.getBoundingClientRect();
   offsetX = BB.left;
   offsetY = BB.top;
   
   draw();
   
   canvas.onmousedown = myDown;
   canvas.onmouseup = myUp;
   canvas.onmousemove = myMove;
   
}
function draw()
{
     clear();
    
     ctx.beginPath();
     ctx.moveTo(x,y);
     ctx.lineTo(x+50,y);
     ctx.lineTo(x+50,y+50);
     ctx.lineTo(x,y+50);
     ctx.strokeStyle = "white";
     ctx.stroke();
     ctx.closePath();
     ctx.clip(); 
     
     ctx.drawImage(img, x, y, 300, 200); 
}                                         

function clear()
{
  ctx.clearRect(0,0,canvas.width, canvas.height);
}
function myDown(e)
{
    var mx = parseInt(e.clientX-offsetX);
    var my = parseInt(e.clientY-offsetY);
    dragok=false;
    
    if(mx>x && mx<x+50 && my > y && my < y+50)
    {
        dragok=true;
    }
    startX = mx;
    startY = my;
    
   
}
function myUp(e)
{
   //Функция если кнопка мыши отпущена
   //....
}

function myMove(e)
{
    if(dragok)
    {
          var mx = parseInt(e.clientX-offsetX);
          var my = parseInt(e.clientY-offsetY);
          var dx = mx-startX;
          var dy = my-startY;
          x+=dx;
          y+=dy
          draw();
          startX = mx;
          startY = my;
    }
}


}
</script>
</head>
<body>
<canvas id="drawingCanvas" style="background:#444444" width="400px" height="300px"></canvas><br>
</body>
</html>

 

Link to comment
Share on other sites

  • 0

Картинка остается на месте, а движется только вырезанная область, а мне нужно чтобы картинка двигалась тоже.

Я сделала видео в качестве примера, он находится во вложенном файле. Сам пример был реализован на ActionScript.

Video.rar

Video.rar

Link to comment
Share on other sites

  • 0

Вот так работает, правда притормаживает. В любом случае этот способ вряд ли пригодится, если один объект тормозит, что будет с остальными их может быть сотни на холсте.

function draw()
{
     clear();
     ctx.globalCompositeOperation = "source-over";
     ctx.drawImage(img, x, y, 300, 200); 
     ctx.globalCompositeOperation = "destination-in";
     ctx.beginPath();
     ctx.moveTo(x,y);
     ctx.lineTo(x+50,y);
     ctx.lineTo(x+50,y+50);
     ctx.lineTo(x,y+50);
     ctx.lineTo(x,y);
     ctx.fillStyle = "white"; 
     ctx.fill(); 
     ctx.closePath();
}

P.S. Прочитала про get/putImageData., правда их еще не использовала. Пишут что они очень ресурсоемкие и без надобности их лучше не использовать.

Edited by Katerina23
Link to comment
Share on other sites

  • 0

Зачем тут вообще globalCompositeOperation. Используйте параметры самой функции drawImage:

// utility function
function drawPuzzle(sx, sy, dx, dy) {
  ctx.drawImage(img, sx, sy, puzzleSize, puzzleSize, dx, dy, puzzleSize, puzzleSize);
}

img.onload = () => {
  // from image: x=100, y=50
  // to canvas: x=0, y=0
  drawPuzzle(100, 50, 0, 0);

  // etc...
  drawPuzzle(0, 150, puzzleSize, 0);
};

 

Link to comment
Share on other sites

  • 0

А если например мне нужно вырезать изображения круглой формы используя метод arc. Или же треугольной использую три линии lineTo. То стандартный набор свойств drawImage мне не поможет. Во flash все было проще, используешь функцию setMask и применяешь маску любой формы, какой захочешь.

P.S. globalCompositeOperation не сработал если изображение спрятать друг от друга то когда они будут находится рядом то одно изображение будет отображаться на другом.

Link to comment
Share on other sites

  • 0
В 20/08/2017 в 09:02, Katerina23 сказал:

А если например мне нужно вырезать изображения круглой формы используя метод arc. Или же треугольной использую три линии lineTo.

Читайте выше.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy