2014-02-19 3 views
1

Я честно понятия не имею, где даже действительно искать это. Я посмотрел на SO, но вопрос был намного сложнее, как обнаружение автомобилей или сложных фигур для игр. У меня просто есть холст (элемент HTML5) с изображением в нем, в котором есть куча прямоугольников и квадратов с изображениями внутри них, и вы хотите обнаружить их, «вырезать» и пропустить их один за другим. Кусок, который я застрял, - , находя фигуры, а затем получая их коорды. Это не изображения, которые я рисую, но другие изображения загружаются, а затем я рисую на холст.Найти квадраты/прямоугольники в холсте

Думайте что-то вроде:

+------------------+ 
| ---- --- ---- | 
| | | | | | | | 
| ---- --- ---- | 
| --------------- | 
| |    | | 
| --------------- | 
|     | 
+------------------+ 

И я хочу, чтобы удалить каждый из этих 4-х блоков, так что я мог бы пройти через них по одному, как:

----  ---  ----  --------------- 
| | => | | => | | => |    | 
----  ---  ----  --------------- 

ответ

0

Если у вас есть только прямоугольники с границами в холсте, затем петлевые холсты и проверьте последовательность одного цвета (найдите угол окна). HTML5 canvas data

0

Зарегистрируйте информацию о каждой фигуре в массиве. В какой-то момент вы или кто-то другой должен говорить холст, чтобы вставить эти прямоугольники и квадраты, так что, конечно, вы должны войти те детали:

var shapes = [] 

// Then in some sort of listener 
shapes.push({x:shapesX,y:shapesY,w:shapesW,h:shapesH}) 

Приобретите эти детали формы, слушая взаимодействия мыши с холста (если то есть, как вы рисуете на холсте):

  • MouseDown - журнал начального X/Y
  • MouseUp - журнал расстояние пользователи указатель путешествовала от исходного X/Y, чтобы получить ширину и высоту
+0

Нет, как я уже сказал, изображение, которое Загруженные JPG/PNG и на нем нарисованы квадраты. –

5

[Очерк о том, как сделать Auto-вырезку из прямоугольников]

Во-первых, размер холста до размера изображения и DrawImage изображение на холсте.

Тогда для каждого прямоугольника холста изображения:

  • Используйте getImageData, чтобы получить массив каждого пикселя цвета на холсте изображение.
  • Начать сканирование цветов сверху слева.
  • Когда вы нажмете нефоновый цвет, вы попали в сторону прямоугольника.
  • (Вы должны ввести цвет фона или предположить, что верхний левый пиксель определяет цвет фона)
  • Пройдите прямоугольник по часовой стрелке, пока не вернетесь в исходное место.
  • («Прогулка» означает перемещение по вертикали/горизонтали после цвета пикселя границы).
  • У вас есть граничная область прямоугольника.
  • (Вам необходимо связать немного большую площадь из-за сглаженных пикселей).
  • Создайте временный холст и поместите его в раскрывающийся размер рамки.
  • Используйте контекстные параметры context.drawImage, чтобы скопировать ограниченный прямоугольник из исходного холста во временный холст.
  • Использование canvas.toDataURL для сохранения временного холста в качестве изображения.
  • Очистить прямоугольники пикселей от холста, используя context.clearRect.
  • Начните процесс снова, чтобы найти следующий прямоугольник.

Вот код и демо-показ авто-клиппинг к изображениям:http://jsfiddle.net/m1erickson/33tf2/

enter image description here

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 
<style> 
    body{ background-color: ivory; } 
    canvas{border:1px solid red;} 
    #clips{border:1px solid blue; padding:5px;} 
    img{margin:3px;}   
</style> 
<script> 
$(function(){ 

    var canvas=document.getElementById("canvas"); 
    var ctx=canvas.getContext("2d"); 
    var cw,ch;   

    // background definition 
    // OPTION: look at the top-left pixel and assume == background 
    //   then set these vars automatically 
    var isTransparent=false; 
    var bkColor={r:255,g:255,b:255}; 
    var bkFillColor="rgb("+bkColor.r+","+bkColor.g+","+bkColor.b+")"; 

    // load test image 
    var img=new Image(); 
    img.crossOrigin="anonymous"; 
    img.onload=start; 
    img.src="https://dl.dropboxusercontent.com/u/139992952/multple/temp2a.png";   

    function start(){ 
     // draw the test image on the canvas 
     cw=canvas.width=img.width/2; 
     ch=canvas.height=img.width/2; 
     ctx.drawImage(img,0,0,cw,ch); 
    } 


    function clipBox(data){ 
     var pos=findEdge(data); 
     if(!pos.valid){return;} 
     var bb=findBoundary(pos,data); 
     clipToImage(bb.x,bb.y,bb.width,bb.height); 
     if(isTransparent){ 
      // clear the clipped area 
      // plus a few pixels to clear any anti-aliasing 
      ctx.clearRect(bb.x-2,bb.y-2,bb.width+4,bb.height+4); 
     }else{ 
      // fill the clipped area with the bkColor 
      // plus a few pixels to clear any anti-aliasing 
      ctx.fillStyle=bkFillColor; 
      ctx.fillRect(bb.x-2,bb.y-2,bb.width+4,bb.height+4); 
     } 
    } 

    function xyIsInImage(data,x,y){ 
     // find the starting index of the r,g,b,a of pixel x,y 
     var start=(y*cw+x)*4; 
     if(isTransparent){ 
      return(data[start+3]>25); 
     }else{ 
      var r=data[start+0]; 
      var g=data[start+1]; 
      var b=data[start+2]; 
      var a=data[start+3]; // pixel alpha (opacity) 
      var deltaR=Math.abs(bkColor.r-r); 
      var deltaG=Math.abs(bkColor.g-g); 
      var deltaB=Math.abs(bkColor.b-b); 
      return(!(deltaR<5 && deltaG<5 && deltaB<5 && a>25)); 
     } 
    } 

    function findEdge(data){ 
     for(var y=0;y<ch;y++){ 
     for(var x=0;x<cw;x++){ 
      if(xyIsInImage(data,x,y)){ 
       return({x:x,y:y,valid:true}); 
      } 
     }} 
     return({x:-100,y:-100,valid:false}); 
    } 

    function findBoundary(pos,data){ 
     var x0=x1=pos.x; 
     var y0=y1=pos.y; 
     while(y1<=ch && xyIsInImage(data,x1,y1)){y1++;} 
     var x2=x1; 
     var y2=y1-1; 
     while(x2<=cw && xyIsInImage(data,x2,y2)){x2++;} 
     return({x:x0,y:y0,width:x2-x0,height:y2-y0+1}); 
    } 

    function drawLine(x1,y1,x2,y2){ 
     ctx.beginPath(); 
     ctx.moveTo(x1,y1); 
     ctx.lineTo(x2,y2); 
     ctx.strokeStyle="red"; 
     ctx.lineWidth=0.50; 
     ctx.stroke(); 
    } 

    function clipToImage(x,y,w,h){ 
     // don't save anti-alias slivers 
     if(w<3 || h<3){ return; } 
     // save clipped area to an img element 
     var tempCanvas=document.createElement("canvas"); 
     var tempCtx=tempCanvas.getContext("2d"); 
     tempCanvas.width=w; 
     tempCanvas.height=h; 
     tempCtx.drawImage(canvas,x,y,w,h,0,0,w,h); 
     var image=new Image(); 
     image.width=w; 
     image.height=h; 
     image.src=tempCanvas.toDataURL(); 
     $("#clips").append(image); 
    } 

    $("#unbox").click(function(){ 
     var imgData=ctx.getImageData(0,0,cw,ch); 
     var data=imgData.data; 
     clipBox(data); 
    }); 

}); // end $(function(){}); 
</script> 
</head> 
<body> 
    <button id="unbox">Clip next sub-image</button><br> 
    <canvas id="canvas" width=300 height=150></canvas><br> 
    <h4>Below are images clipped from the canvas above.</h4><br> 
    <div id="clips"></div> 
</body> 
</html> 
+0

Это радарный сниппет! Это не совсем то, что я искал :) Из моего сообщения «у него есть куча прямоугольников и квадратов с изображениями внутри них и они хотят обнаружить каждый». Я ищу способ обнаружить. Вот пример: http://nedroid.com/comics/2010-09-06-guest-comic-jay-fuller.png - Мне нужен код, который выплюнул бы каждый из этих четырех квадратов. –

+0

Они могут быть прямоугольниками или квадратами любого размера и контура цвета. –

+0

Я добавил пример кода, который находит и закрепил прямоугольные прямоугольники, которые были нарисованы на холсте. Ура! – markE

Смежные вопросы