실생활에서 우리는 종종 이런 문제에 직면하게 됩니다: 하나의 폴더 안에 여러 하위 폴더가 있고, 각 폴더 안에 많은 이미지가 있으며 이 이미지들의 형식을 변경하고 싶을 때입니다.
예를 들어, .png 형식의 이미지는 배경 투명을 지원하지만 배경이 불투명한 .jpg 이미지로 변환하고 싶을 수 있습니다. 또한, .bmp 형식은 비압축 이미지이므로 저장 공간을 절약하기로 무손실 압축된 .png 이미지로 변환하고 싶을 수도 있습니다.
이미지 수가 적다면 Windows에 기본 포함된 그림판 도구나 다른 이미지 뷰어 소프트웨어를 통해 "다른 이름으로 저장" 기능으로 하나씩 변환할 수 있습니다. 하지만 이미지가 많다면 어떻게 해야 할까요?
이 문제에는 두 가지 핵심 요소가 있습니다:
① 일괄 처리가 필요합니다.
② 폴더 안에 하위 폴더가 존재합니다.
저는 Halcon과 Photoshop 모두에 익숙하므로, 다양한 독자를 위해 두 가지 방식을 제시합니다.
첫 번째: Halcon을 사용하여 이미지 형식 일괄 수정하기.
원본 폴더와 이미지는 다음과 같습니다:
코드는 다음과 같습니다:
1 <strong>목록_파일</strong> ('D:/pic', ['파일',<strong>'재귀'</strong>], 이미지_목록)
2 *'ignore_case': 대소문자 무시
3 튜플_정규식_선택 (이미지_목록, [<strong>'\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$'</strong>,'ignore_case'], 이미지_목록)
4 인덱스 :=0 to |이미지_목록| - 1 by 1
5 이미지_읽기 (이미지, 이미지_목록[인덱스])
6 *tuple_strlen은 튜플의 특정 요소 길이를 얻는 것이지, 튜플의 요소 수가 아닙니다
7 <strong> 튜플_문자열_길이 (이미지_목록[인덱스], 길이)
</strong> 8
9 *.bmp를 제거하기 위해 - 5를 합니다
10 튜플_문자열_추출 (이미지_목록[인덱스], 0, <strong>길이 -5</strong>, 하위_문자열)
11 이미지_쓰기 (이미지, <strong>'png'</strong>, 0, 하위_문자열)
12
13 endfor
설명:
목록_파일 연산자의 '재귀' 매개변수는 "재귀적" 을 의미하며, 하위 폴더의 파일을 재귀적으로 찾습니다. 이미지_목록[인덱스] 는 각 이미지의 실제 경로입니다. 경로 문자열의 잘라내기 작업을 통해 .bmp 확장자가 없는 파일명을 얻고, 최종적으로 이미지를 .png 형식으로 저장합니다.
처리 결과는 다음과 같습니다:
이미지가 일괄 변환되었으며, .png 형식 이미지가 차지하는 저장 공간이 .bmp 파일보다 현저히 작은 것을 볼 수 있습니다.
물론 코드는 개선할 여지가 있습니다. 예를 들어, .png 파일로 저장하는 동시에 원본 .bmp 파일을 삭제하고 싶을 수 있습니다. 코드는 다음과 같이 수정합니다:
1 목록_파일 ('D:/pic', ['파일','재귀'], 이미지_목록)
2 *'ignore_case': 대소문자 무시
3 튜플_정규식_선택 (이미지_목록, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], 이미지_목록)
4
5 <strong>변환_완료 := 0</strong>
6 인덱스 :=0 to |이미지_목록| - 1 by 1
7 이미지_읽기 (이미지, 이미지_목록[인덱스])
8
9 <strong>if (변환_완료 = 1)
</strong>10 <strong>파일_삭제 (이미지_목록[인덱스 -1])
</strong>11 <strong> endif
</strong>12
13 *tuple_strlen은 튜플의 특정 요소 길이를 얻는 것이지, 튜플의 요소 수가 아닙니다
14 튜플_문자열_길이 (이미지_목록[인덱스], 길이)
15
16 *.bmp를 제거하기 위해 - 5를 합니다
17 튜플_문자열_추출 (이미지_목록[인덱스], 0, 길이 -5, 하위_문자열)
18 이미지_쓰기 (이미지, 'png', 0, 하위_문자열)
19 <strong>변환_완료 := 1</strong>
20 endfor
21
22 <strong>파일_삭제 (이미지_목록[인덱스 -1])</strong>
마지막 줄 코드 파일_삭제 (이미지_목록[인덱스 -1]) 는 for 루프를 빠져나간 후 마지막 .bmp 이미지를 삭제하는 역할을 합니다.
두 번째: Photoshop을 사용하여 이미지 형식 일괄 수정하기.
이 부분은 간략히 설명하겠습니다.
① Photoshop에서 .png로 변환하는 동작(창——동작)을 먼저 기록합니다.
② 파일——자동——일괄 처리를 통해 방금 기록한 동작을 일괄 실행할 수 있습니다.
첫 번째 방식과 비교하여, Photoshop으로 이 문제를 해결하는 데에는 한 가지 결점이 있습니다: 변환된 이미지는 하나의 폴더에만 저장될 수 있으며, 원본 파일처럼 다른 폴더(예: 다른 하위 폴더)에 저장할 수 없습니다. 사실 이해할 수 있는 부분이기도 합니다. 이미 만들어진 소프트웨어는 직접 코드를 작성하는 것만큼 유연하지 않으니까요.
위의 어떤 방법을 사용하든, 이미지가 수천 장에 달한다면 효율 향상은 놀라울 정도입니다 - 컴퓨터가 계속 작동하게 하고 잠시 산책하고 돌아오면 모든 작업이 완료되어 있을 것입니다.