주어진 비율로 jpg 이미지 분할 (imagemagick)

주어진 비율로 jpg 이미지 분할 (imagemagick)

jpg 형식으로 스캔한 이미지가 많이 있습니다. 아래 사진에서 볼 수 있듯이 카드는 양면입니다. 스캔할 때 스캐너 내부에 6개의 카드를 넣었습니다.

아래 그림에서 첫 번째 카드의 앞면은 1번, 뒷면은 7번입니다. 두 번째 카드의 앞면은 2번, 뒷면은 8번 등입니다.

내가 달성하고 싶은 것: 다음과 같은 순서로 개별 카드를 포함하는 폴더를 만드는 방식으로 이러한 파일(image1.jpg 및 image2.jpg)을 분할합니다.

1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg) 

3.jpg(2)
4.jpg(8)
etc

(image1.jpg) 6개 카드의 앞면: 카드 앞면

(image2.jpg) 카드 6개 뒷면: 카드 뒷면

1- imagemagick(또는 다른 솔루션)을 사용하여 이러한 구분선을 기반으로 이미지를 어떻게 분할할 수 있습니까? (모든 이미지가 2550x3507이기 때문에 이 선의 x와 y를 얻을 수 있습니다)

구분선은 빨간색입니다. 구분선은 빨간색입니다.

  1. 분할 후 또는 분할 중에 위에서 설명한 원하는 순서에 따라 자동으로 번호를 매길 수 있습니까?

답변1

[ImageMagick?]을 사용하여 이러한 구분선을 기반으로 이미지를 어떻게 분할할 수 있습니까?

아마도 가장 간단한 해결책은 다음을 사용하는 것입니다.-수확고이렇게:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

이 명령은 다음과 같습니다.

  • 각 이미지를 대략 동일한 크기의 타일 6개로 나눕니다(-3x2@ 자르기), 순서대로 번호를 매깁니다.

  • 1( 에서 번호 매기기 순서를 시작합니다 .-장면 1)보다는 0.

  • 마지막 숫자 에 한 자리 숫자 [ ]에 0패딩( %02d) 을 부여합니다 01-09.

명령 참고사항

  • 1000x1000타일 ​​자르기에 대해 정확한 크기(예: )를 지정하거나 백분율(예: )을 사용하는 것이 가능하지만 33%x50%이로 인해 잠재적으로 "잘라내기" 이미지도 생성될 수 있습니다(바람직하지 않을 수 있음).

  • 예를 사용하면 일반적으로 " 트리밍" 이미지 생성을 방지하기 위해 -3x2@"오버슈팅" 백분율(예: )보다 크기가 더 가까운(서로 상대적으로) 이미지가 생성됩니다 .33.4%x50%

  • 배치 파일에서 의도한 대로 작동하려면 백분율 기호를 두 배로 늘려야 합니다.

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
    
  • 이미지/캔버스 오프셋을 가질 수 있는 형식(예: )에 쓰는 경우 .png다음을 포함할 수 있습니다.+재페이지당신 이후 -crop:

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
    
  • +repage입력 형식에 이미지/캔버스 오프셋이 포함될 수 있는 경우 이를 원할 수도 있습니다 .


이름 바꾸기

위에서 설명한 순서에 따라 자동으로 번호를 매기는 것이 가능한가요?

ImageMagick만으로는 그렇게 할 수 없었습니다(가능하지 않을 것 같지만 솔직히 이에 대해 확신할 수 없습니다). 물론 ImageMagick과는 별개로 이는 완전히 가능합니다.

이 질문에 태그를 달았으므로 batch언급할만한 가치가 있습니다. 아마도 일괄적으로 좋은 솔루션을 제공하는 데 도움을 줄 수 없을 것입니다. 이를 염두에 두고, 귀하(또는 다른 누군가)가 아래에 자세히 설명하는 것보다 더 나은 것을 생각해낼 수 있을 가능성이 매우 높습니다.

의무 배치(비)답변

배치를 사용하면 무차별 대입으로 이름을 바꿀 수 있습니다. 먼저, 모든 파일(첫 번째 파일과 마지막 파일 제외)의 이름을 일시적으로 바꿉니다. 예:

rename cropped_02.jpg  cropped_02_temp.jpg 
[...]
rename cropped_11.jpg  cropped_11_temp.jpg 

그런 다음 이름을 다시 새 위치로 바꿉니다. 예:

rename cropped_02_temp.jpg  cropped_03.jpg
rename cropped_03_temp.jpg  cropped_05.jpg 
rename cropped_04_temp.jpg  cropped_07.jpg 
rename cropped_05_temp.jpg  cropped_09.jpg 
rename cropped_06_temp.jpg  cropped_11.jpg 
rename cropped_07_temp.jpg  cropped_02.jpg 
rename cropped_08_temp.jpg  cropped_04.jpg 
rename cropped_09_temp.jpg  cropped_06.jpg 
rename cropped_10_temp.jpg  cropped_08.jpg 
rename cropped_11_temp.jpg  cropped_10.jpg 

Batch에는 명령줄에서 인수를 가져와 수학을 수행할 수 있을 뿐만 아니라 for루프와 if명령문 등을 포함할 수 있으므로 이 솔루션을 (분명히) 개선할 수 있습니다.


메모 이름 바꾸기

위 이름 바꾸기 프로세스의 후반부를 살펴보면 파일 이름에 패턴이 있음을 알 수 있습니다. 효과적으로 특정 위치 N에 대해 다음 두 공식 중 하나를 사용하여 구성표에서 항목의 새 위치를 찾을 수 있습니다.

  • "중간" 지점까지의 항목(예: 2-6): (Position_N * 2) - 1
  • "중간" 지점을 벗어난 항목(예: 7-11): (Position_N * 2) - Total_Items

참고: 이러한 수식을 전체 시퀀스(예: 1 및 12)에 적용할 수 있지만 첫 번째 항목과 마지막 항목의 위치는 변경되지 않습니다. 이로 인해 이름을 바꿀 필요가 없게 됩니다.


또한 이는 어떤 경우에도 작동합니다.심지어(홀수 아님) 항목/위치 수(4 이상), 파일 이름이 순서대로(예: 1 ~ 12) 가정합니다. 따라서 원래 예의 경우:

Temp Item 2 becomes (2 * 2) - 1  = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]

따라서 주어진 공식은 잠재적으로 배치(또는 기타 스크립팅) 솔루션의 기초가 될 수 있습니다. 그러나 이를 그대로 사용하기로 결정한 경우 알아야 할 몇 가지 다른 사항이 있습니다.

정렬

위에서 언급한 대로 정렬은 Windows에서 "순서가 맞지 않는" 반환된 항목이 주어진 수식을 "깨뜨리기" 때문에 스크립트와 같은 항목에서 실질적인 결과를 초래할 수 있습니다. 특히:

  • Windows는 이름을 다음과 같이 정렬합니다.사전식기본으로 주문하세요. 이는 0한 자리 숫자 앞에 가 붙지 않은 항목을 의미합니다 (예:이미지_1.jpg이미지_01.jpg)은 Windows에서 직접 반환할 때 (자연스러운) 순서로 표시되지 않습니다. 즉, 다음과 같이 반환됩니다.

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
    
  • 파일 이름의 특정 단어 및 문구(예: - Copy)도 파일 이름이 반환되는 순서에 영향을 줄 수 있습니다.

위의 공식을 사용하는 경우 0파일 이름에 한 자리 숫자를 -pad하고 같은 항목을 제거하십시오 - Copy(또는 이러한 문제를 완화하기 위한 조치를 취하십시오).

0으로 시작하는 루프/카운터

예를 들어 루프 내에서 계산을 시작하는 언어를 사용하는 경우 0수식이 약간 변경될 수 있습니다.

  • "중간" 지점까지의 항목(예: 1-5): (Position_N * 2)
  • "중간" 지점을 벗어난 항목(예: 6-10): (Position_N * 2) - (Total_Items - 1)

0부터 계산하면 12개의 항목이 실행됩니다 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Python 스크립트

당신이 관심이 있다면, 나는 작은 글을 썼습니다. (아마도 끔찍할 것입니다)파이썬 스크립트Python 3.x(3.6.4로 테스트됨)의 경우 명령줄에서 순서대로 임의 파일의 이름을 바꾸는 데 사용할 수 있습니다(예:자른_01.jpg...잘린_XX.jpg) 귀하의 질문에 명시된 순서대로. 당신은해야합니다파이썬 사본을 가지고 있다시험해 보기로 결정했다면 설치하세요.

제한 사항

  • 정보를 얻기 위해 텍스트 파일을 읽지 않습니다(따라서 현재 파일 목록을 지정하지 않음). 마찬가지로 명령줄에는 이미지/파일 이름 접두사와 확장자가 필요합니다.

  • 있는 그대로 스크립트는 파일 이름이 자동으로 올바른 순서로 반환될 것으로 예상합니다( 0위의 Windows 및 -padding 참조).

  • 항목이 패딩되지 않은 경우 natsort(예: 로 설치됨 ) 이라는 타사 모듈을 사용하는 옵션이 있습니다 . 하지만 이 옵션을 사용하려면 설치 후 스크립트에서 13행( )과 105행( ) 의 주석 처리를 제거해야 합니다 .python -m pip install natsort0from natsort import natsorteditem_list = list(natsorted(item_list))natsort

명확하게 말하면 "주석 해제"는 #줄 시작 부분의 선행 공백을 제거하는 것을 의미합니다. 사용법에 대한 추가 지침이 스크립트에 포함되어 있습니다.

관련 정보