다른 이미지 내에서 특정 이미지의 위치를 ​​얻는 방법은 무엇입니까?

다른 이미지 내에서 특정 이미지의 위치를 ​​얻는 방법은 무엇입니까?

각 스크린샷에 동일한 그래픽이 포함된 PNG 스크린샷이 많이 있습니다. 작품은 모든 이미지에서 동일한 크기를 갖습니다.

각 파일의 위치를 ​​찾으려면 어떤 명령줄 프로그램을 사용할 수 있습니까(하나씩 입력)?

답변1

다음은 대략적인 아이디어일 뿐이며 기성 솔루션이 없습니다(특히 코드가 없는 경우!).

작은 그래픽과 스크린샷 샘플을 원시(압축되지 않은) 형식으로 변환하겠습니다(열중량 분석압축은 전혀 없으며 모든 픽셀을 완전히 덤프한 것입니다. 그런 다음 grep을 사용하여 스크린샷 파일에서 그래픽을 찾습니다. 그런 다음 위치를 계산하십시오.

identify계산을 수행하려면 Image Magick의 명령을 사용하여 얻을 수 있는 이미지의 크기(너비 및 높이)가 필요합니다 . 그건:

GRAPHIC_WIDTH=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*Geometry:\ \(.*\)x.*%\1%p')
GRAPHIC_HEIGHT=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*x\([^+]*\)+.*%\1%p')

TGA 파일의 처음 18바이트는 픽셀 정보를 포함하지 않으므로 생략해야 합니다.

tail -c +19 graphic.tga > graphic.colorinfo

grep그리고 MatthewRock의 댓글처럼 행 단위로 저장되고 스크린샷의 픽셀로 둘러싸여 있기 때문에 전체 그래프를 한 번에 검색 할 수 없습니다 . 행 단위로 검색해야 합니다. 그래픽이 발견되면 X 픽셀만큼 두 번째 행을 추가로 검색합니다. 여기서 X는 스크린샷 너비에서 그래픽 너비를 뺀 값입니다.

grep이 옵션은 K 픽셀에서 개행으로 구분된 그래픽 파일과 함께 사용해야 합니다 -F. 여기서 K는 그래픽 너비에 색상 심도를 곱한 바이트 단위입니다. head이것을 사용 하고 수행하십시오 tail. 색상 심도가 8비트인 경우 각 픽셀 라인의 길이는 K바이트이고, 색상 심도가 24비트 또는 3바이트와 같이 더 높으면 픽셀 라인의 길이는 K x 3바이트입니다.

라인 10은 길이가 20픽셀이고 색상 깊이가 3바이트이며 다음을 통해 얻을 수 있습니다.

head -c $((10*20*3)) graphic.colorinfo | tail -c 60

물론 이것을 쉘 코드로 작성하는 것은 어떤 경우에는 약간 복잡할 수 있습니다. 예를 들어 스크린샷이 (그래픽과 마찬가지로) 완전히 흰색 단색이고 그래픽에 검정색 픽셀이 하나만 있는 경우입니다.

임시 시작 좌표(첫 번째 행 일치의 가장 왼쪽 및 맨 위 픽셀 위치)를 저장하고 한 행이 일치하지 않을 때까지 거기에서 아래 행을 검색한 후 다음 일치의 첫 번째 행부터 시작하는 것이 아이디어입니다. 등. .

마침내16진수 편집기와 같은 바이트 수준(텍스트 도구를 사용한 이미지 작업에는 적합하지 않음)에서 이 작업을 수행하는 것이 훨씬 쉬울 것이라고 말하고 싶습니다. 아니면 C나 Python을 사용하는 것이 더 좋습니다. 하지만 방법은 동일합니다(일치하는 줄 검색).

관련 정보