다음은 내 대답을 완전히 다시 작성한 것입니다. 게 멋진 때문에,
내가 시작 사진 같은 게와 함께 가기로 결정 : 임의의 사진을 감안할 때
, 일부 color
가 일치하는 경우에만 많은 작은 사진을 맞게
그림에서 파란색 부분에 빨간 점만 추가하고 싶습니다.
이를 위해, 나는 3 절에 내 대답을 분할합니다 :
HTML
을 나는 아주 간단한 HTML 파일을 시작합니다
<html>
<head>
<title>Crab Example</title>
</head>
<body>
<div>
<h1>Dots on the crab example</h1>
</div>
<div id="crabSection">
<img src="crab.png">
</div>
</body>
</html>
이 우리에게 출발점을 제공합니다 점선 게를 그리기 위해서!
지금, PHP, 나는 열 PHP 모두 내 crab.png
내 dot.png
콘텐츠를 분석하고, dot.png
가 all blue
섹션에 들어갈 수있는 임의의 위치를 찾습니다.오른쪽 <img src="crab.png">
후, 나는 다음에 삽입 :
<?php
$crab = imagecreatefrompng("crab.png");
$dot = imagecreatefrompng("dot.png");
$numDesiredDots = 10;
$numCreatedDots = 0;
$crabWidth = imagesx($crab);
$crabHeight = imagesy($crab);
$dotWidth = imagesx($dot);
$dotHeight = imagesy($dot);
$spawnableWidth = $crabWidth - $dotWidth;
$spawnableHeight = $crabHeight - $dotHeight;
srand(time());
$testingForDotSubpart = imagecreatetruecolor($dotWidth, $dotHeight);
$validCoordinates = array();
$invalidCoordinates = array();
$colorWereLookingFor = 0xFF; // ARGB - our crab is blue
여기
, 몇 가지 세부 사항 :
$numDesiredDots
10으로 하드 코딩되어 있지만, 쉽게 매개 변수가 될 수있다!
$spawnableWidth
및 $spawnableHeight
는 dot
단순히 난을 테스트하기 위해 사용됩니다 작은 이미지는 다른 임의마다
$testingForDotSubpart
을하는 데 사용되는 그림
srand(time());
의 외출없이 배치 할 수 있습니다 좌표 가장 큰 대표 지정된 색상의 픽셀 만 포함되어 있는지 확인하기 위해 주어진 좌표입니다. red
을 원한다면 제 게가 파란색이므로 blue
으로 설정되고 과 같아야합니다. blue
으로 설정되어 있습니다. 현재으로 설정되어 있습니다. 이 예제에서는 HTML과 이미지 처리에 동일한 PNG를 사용했지만 이미지 처리를위한 마스크를 만들고 HTML에 대한 풀 컬러 이미지를 쉽게 만들 수있었습니다. 우리만큼
- 우리는 반복 : 다시
while($numCreatedDots < $numDesiredDots)
{
$randomX = rand() % $spawnableWidth;
$randomY = rand() % $spawnableHeight;
imagecopy($testingForDotSubpart, $crab, 0, 0, $randomX, $randomY, $dotWidth, $dotHeight);
$valid = true;
for($x = 0; $x < $dotWidth; $x++)
{
for($y = 0; $y < $dotHeight; $y++)
{
if(imagecolorat($testingForDotSubpart, $x, $y) != $colorWereLookingFor)
{
$valid = false;
break 2;
}
}
}
if($valid)
{
array_push($validCoordinates, array('x' => $randomX, 'y' => $randomY));
$numCreatedDots++;
}
else
{
// you can get rid of this else, it's just to show you how many fails there are
array_push($invalidCoordinates, array('x' => $randomX, 'y' => $randomY));
}
}
몇 가지 설명 :
이제, 우리는 다음과 같은 PHP로 수행 될 때마다 점, 유효 좌표를 생성해야 우리가 원하는 모든 점들을 만들지는 못했고, 매우 복잡한 이미지의 경우 너무 많은 시간이 걸릴 수 있습니다. 최대 시도 횟수를 더할 수 있습니다.
X,Y
코디네이트
우리는 점들이 올바른 색상
- 윈도우가 유효한 경우의 있는지 확인하기 위해 우리는이 창 내에서 모든 픽셀을 테스트
- 을 끝낼 수있는 작은 창을 복사 먹었다, 우리는에 좌표를 추가 디버깅을 위해 배열
- , 나는 많은 시도가 실패하는 방법을 보여 위해
$invalidCoordinates
배열을 추가 - 더 복잡한 그림을, 더 많은 우리가 우리의 모든 위치를 계산 했으므로
가있을 것입니다 실패, 우리는 필요 리소스 정리 :
imagedestroy($testingForDotSubpart);
imagedestroy($dot);
imagedestroy($crab);
마지막으로 제거 할 수있는 디버그 출력을 추가했지만 크랩에 점을 출력해야합니다. 여기
echo "<p>Valid Coords: <br>";
foreach($validCoordinates as $coord)
{
echo "X: " . $coord['x'] . " Y: " . $coord['y'] . "<br>\n";
}
echo "<br>Invalid Coords " . count($invalidCoordinates) . "</p>\n";
// Now add the dots on the crab!
for($i = 0; $i < count($validCoordinates); $i++)
{
$coord = $validCoordinates[$i];
echo "<div class='dot' style='left:".$coord['x'].";top:".$coord['y'].";'><a href='javascript:alert(".$i.");'><img src='dot.png'></a></div>\n";
}
?>
, 내가 style
left
및 top
이 점에 대한 정확한 픽셀 위치를 제공하기 위해 사용하고 각 점은 독특한 있음을 보여주기 위해, 나는 도트 인덱스를 표시하는 JavaScript
alert
를 부착. 이들을 부모 그림과 정확히 일치 시키려면 다음 절에서 설명하는대로 position:relative;
과 position:absolute;
을 사용해야합니다.당신이 볼 수 있듯이, 나는 div
에 대한 클래스를 사용하고
CSS
, 이것은 relative positioning
을 활용하는 것입니다. 나는 주어진 스크립트의 실행이 여기에
결과
#crabSection { position:relative; }
.dot { margin: 0px 0px 0px 0px; position:absolute; }
있어 다음, 바로 제목 후, 파일의 맨 위에 추가 ... 당신은 쉽게 HTML은 돈 때문에 발생 절약 할 수 'T는 매번 위치를 다시 계산해야합니다 :
희망이 도움이!
편집 : 여기에 전체 코드는, 당신이 그것을 필요로하는 경우 : pastebin
편집 2 : 당신은 사각형 $randomX
, $randomY
에 의해 정의 된 것을 확인 할 수 있습니다, 더 중복 검사가 없음을 유의 $randomX + $dotWidth
및 $randomY + $dotHeight
은 $validCoordinates
의 좌표에서 기존의 사각형과 겹치지 않습니다.
편집 3 : 일단 당신이 단순히 HTML
그래서 재생 아니에요 매번에 div
를 페이지의 소스를 열고 복사 할 수 있습니다 생성. 또한
<div class='dot' style='left:100;top:105;'><a href='javascript:alert(0);'><img src='dot.png'></a></div>
<div class='dot' style='left:150;top:151;'><a href='javascript:alert(1);'><img src='dot.png'></a></div>
<div class='dot' style='left:128;top:73;'><a href='javascript:alert(2);'><img src='dot.png'></a></div>
<div class='dot' style='left:144;top:93;'><a href='javascript:alert(3);'><img src='dot.png'></a></div>
<div class='dot' style='left:164;top:91;'><a href='javascript:alert(4);'><img src='dot.png'></a></div>
<div class='dot' style='left:108;top:107;'><a href='javascript:alert(5);'><img src='dot.png'></a></div>
<div class='dot' style='left:22;top:101;'><a href='javascript:alert(6);'><img src='dot.png'></a></div>
<div class='dot' style='left:54;top:151;'><a href='javascript:alert(7);'><img src='dot.png'></a></div>
<div class='dot' style='left:32;top:121;'><a href='javascript:alert(8);'><img src='dot.png'></a></div>
<div class='dot' style='left:142;top:87;'><a href='javascript:alert(9);'><img src='dot.png'></a></div>
, 같은 당신이 화려한 게를 원한다면 PHP에서 연 $crab
사진 설명 색 마스크, 당신은 뭔가에 img src
을 변경할 수있다. 나는 지금 내 img
에서 사용하는 crabc.png
파일을 추가했지만 여전히 crab.png
파일과 같은 윤곽이 : 마지막 모습을 제공 이
:
PHP 실행을 서버에. JavaScript는 클라이언트에서 실행됩니다. 네가 네가 정말로 묻고있는 걸 이해할 것 같지 않아. 더 구체적으로 말하십시오. –
완료 여부는 중요하지 않으며 클라이언트 또는 서버 측에서 수행 할 수 있습니다. 둘 다 괜찮을거야. 서면으로, 나는 그림에 불타 질 레이어가 필요 없지만 절대 위치를 가진 div로 추가됩니다. 내가 볼 수있는 것만 큼 유효한 X/Y 위치를 얻음으로써 만 수행 할 수 있지만 얻을 수있는 가장 큰 문제입니다. 어쩌면 내가 이미지를 업로드 한 다음 도형을 그릴 수있는 도구가 있습니까? 스크립트가 선택한 영역의 모든 X/Y 값을 계산합니까? 그것은 매우 유용 할 것입니다. –