Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

이 Bash 스크립트로 이미지 처리 자동화

작가는 단어로 작업할 뿐만 아니라 종종 이미지로 작업해야 합니다. 기술적인 글쓰기는 기술과 프로세스를 전달하기 위해 많은 스크린샷을 제시하는 것을 포함합니다. 게시 플랫폼마다 이미지 형식이나 파일 크기 등 이미지에 대한 다양한 요구 사항이 있을 수 있습니다.

IT 컨설턴트 및 시스템 엔지니어로서 저는 일반적으로 필요한 형식으로 Microsoft Word(.doc)를 사용하여 클라이언트 결과물로 많은 기술 문서를 작성했습니다. 모든 문서는 콘텐츠가 추가됨에 따라 빠르게 성장할 수 있습니다. 초기에 스크린샷은 파일 크기가 매우 큰 비트맵(.bmp)인 경우가 많았습니다. 서버에 운영 체제 설치를 설명하는 문서는 결국 매우 큰 파일이 될 수 있습니다.

이미지를 읽을 수 없도록 렌더링하지 않고 축소하는 것은 힘든 작업이었습니다. 비트맵은 jpeg 파일 및 이후의 png 파일로 변환될 수 있습니다. 사무실 제품군을 LibreOffice로 전환한 후에도 편집은 계속해서 어려운 문제였습니다. 다행히 오늘날 대부분의 스크린샷 도구는 png와 같은 더 작은 형식으로 저장합니다.

Opensource.com은 기사에 사용되는 이미지에 특정 제한을 두고 있습니다. 나는 내 기사의 이미지를 준비하는 빠른 3단계 방법을 개발했습니다. 첫 번째 단계는 창 크기 조정 또는 글꼴 변경과 같은 스테이징에 대해 현명하게 대처하는 것입니다. 두 개의 추가 단계가 매우 반복적이었습니다. 이는 이미지가 600픽셀 너비 제한을 초과하지 않도록 하고 테두리를 적용하기 위한 것입니다.

prepimg.sh 스크립트

prepimg.sh라는 Bash 스크립트를 작성했습니다. 이러한 작업을 처리합니다. 이 스크립트는 ImageMagick 제품군의 두 가지 도구를 사용합니다.

이미지 크기 조정

스크린샷 유틸리티는 이미지를 Pictures에 저장합니다. Screenshot-20210923222312.png와 같은 일반 이름을 가진 디렉토리 . 내 prepimg.sh 스크립트는 이 디렉토리에 있는 파일의 픽셀 너비를 확인하고 제한을 초과하는 모든 파일의 크기를 조정합니다. 이 단계에서는 식별을 사용합니다. ImageMagick 제품군의 프로그램을 사용하여 너비(%w)를 결정합니다.

$ identify -format %w Screenshot-20210903202655.png
1217

너비 값은 W 변수에 할당됩니다. 600 제한에 대한 비교기로 사용합니다. 제한 자체는 $MAXWIDTH 변수를 통해 구성할 수 있습니다. . 너비가 MAXWIDTH를 초과하는 것으로 확인되면 convert라는 다른 ImageMagick 프로그램이 이미지의 너비를 줄이기 위해 호출됩니다. 다음은 내 스크립트의 이미지 처리 기능입니다.

     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     
     ...    

이미지는 필요에 따라 크기가 줄어들고 $READY에 의해 정의된 다른 디렉토리에 저장됩니다. 변하기 쉬운. 이 경우 이미지는 실제로 약간 더 작게(598픽셀) 크기가 조정되어 다음에 보여드릴 테두리를 추가할 수 있습니다.

이미지에 테두리 추가

때때로 이미지가 웹 페이지의 배경과 혼합되어 나타날 수 있습니다. 이미지의 가장자리까지의 전경색이 사이트의 배경색과 같기 때문입니다. 다음은 예입니다:

이 Bash 스크립트로 이미지 처리 자동화 이미지 제공:

테두리가 없는 이미지입니다. (CC BY-SA 4.0)

위의 이미지에서 볼 수 있듯이 이미지의 가장자리가 어디인지 알 수 없습니다. 이 문제는 흰색에만 국한되지 않습니다. 각 개별 사이트와 사용하는 테마 색상에 따라 다릅니다. 따라서 배경이 빨간색이고 이미지 가장자리도 빨간색이면 이와 동일한 문제가 발생합니다. 내 스크립트는 convert를 사용하여 이 문제를 해결합니다. 도구. -테두리 옵션은 1픽셀 크기의 각 이미지 파일에 테두리를 추가합니다. 이 옵션만으로도 충분하지만 -bordercolor를 사용하여 색상을 설정하고 싶습니다. 옵션. 다음은 예입니다:

convert -bordercolor black -border 1 Screenshot-20210903202655.png

아래는 테두리가 있는 동일한 이미지입니다. 더 멋있어 보이지 않나요?

이 Bash 스크립트로 이미지 처리 자동화 이미지 제공:

테두리가 있는 이미지. (CC BY-SA 4.0)

이미지가 준비되었습니다

for를 사용합니다. 루프를 사용하여 스크린샷 디렉토리를 반복합니다. process_img 함수를 호출합니다. 각 파일에 대해. 이 함수는 너비와 테두리를 모두 처리합니다. 전체 코드는 파일이 실제로 이미지인지 확인하는 것과 같은 일부 온전성 검사를 수행합니다.

process_img() {
     # verify that file is an image file, and then get dimensions
     if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
         W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
     else
         echo "File ${SCREENSHOTS}/${1} is not an image."
         W=0
     fi
 
     # resize and border
     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     else
         convert -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     fi
 }

스크립트의 마지막 단계는 처리된 파일을 Ready라는 하위 디렉토리에 저장하는 것입니다. , 이는 $READY라는 변수에 의해 결정됩니다. . 이렇게 하면 나중에 사용할 수 있도록 원본 파일이 보존됩니다.

사용

Prepimg.sh 인수와 사용법을 설명하는 예상 도움말 기능이 포함되어 있습니다.

$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)

코드 및 결론

기사에 제시된 코드는 불완전하며 의사 코드로 간주되어야 합니다. 내 Git 저장소에서 전체 스크립트를 볼 수 있습니다.

ImageMagick 제품군은 이미지를 조작하기 위한 강력한 도구 세트입니다. 내 작은 스크립트에 통합된 기능 외에도 더 많은 작업을 수행할 수 있습니다. 기자 Jim Hall도 최근에 이미지 크기를 조정하는 데 사용하는 방법에 대해 썼습니다.

Bash 스크립팅을 선호하든 C 또는 Python과 같은 다른 언어로 코딩하든 자동화는 큰 도움이 됩니다. 시간이 지남에 따라 저는 약간의 코드가 얼마나 많은 골칫거리를 줄이고 시간을 더 잘 활용할 수 있는지 보았습니다.