스크립트 만들어 게을리 살자 (3)

매뉴얼
자, 2편에서 우리는 img_resize 라는 스크립트를 만들었다. 이걸 좀 더 우리의 욕망을 충실히 담도록 진보시키자.
하지만 그전에, 도대체 우리가 뭘 하고 있는지 실제로 확인해야 좀 더 신이 날 것 같다. 저렇게 만든 스크립트를 어떻게 실행하고, 활용할지 보자.

우선, 리눅스는 보안을 위해 적절한 권한이 없으면 말을 안듣는다.
img_resize 가 실행하려면 먼저 이 파일에 "실행권한"을 줘야 한다. 그냥 여기서 이해하던 못하던 아래처럼 하자.

$ chmod +x img_resize

1, 2 편에서 설명 안했지만, "$"로 시작하는 줄은 실제로 그렇게 타이핑하라는 것인데, 리눅스에서 터미널을 열면


그림의 맨 아래보면 커서(cursor)가 깜박이고 있다. 이 상태에서 타이핑을 하면 된다. $ 뒤의 내용만 치시라.
혼동을 막기 위해 위의 예를 충실히 반영하면,

mediaction:~/Desktop/images$
mediaction:~/Desktop/images$ chmod +x img_resize

자, 이제 img_resize 를 실행할 수 있다. 아래처럼 한다.

mediaction:~/Desktop/images$ ./img_resize

일단은 많은 거 생각 말고 그냥 그렇게 하자.

자, 이제 파일 관리자(GUI)를 열어 이미지를 열어보자. 지금 디렉토리(~/Desktop/images)에 있는 모든 이미지 크기가 640 x 480으로 되어 있을 것이다.

그럼 어떻게 해야 잘 썼다고 소문이 날까? 집에서 윈도우를 쓰고 있다가 이미지 작업을 할 일이 생겼다고 하자. 디카로 찍은 사진을 어디 올리거나 하려고 파일 크기를 줄이려는데 그게 백마흔아홉장이다.
우선 주변에 리눅스를 쓰는 사람이 있는지 섭외한다. 그리고 그 사람의 컴퓨터에 FTP등의 방법으로(USB로 옮겨도 되고 여튼 어떻게든 해서) 이미지와 이 스크립트 파일(텍스트)을 보낸다. 그리고 그 사람이 스크립트를 한번 실행해 준다음, 다시 이미지 파일들을 가져오거나, 거기서 바로 올리면 되겠다.

-------- 스크립트 업그레이드 하기 ---------
앞에서 만든 img_resize 스크립트 내용을 다시,

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         convert -resize 640x480 *.png
    fi
done

자, 이제 무엇을 할까? 이것만으로도 삶이 많이 윤택해질 수 있지만, 기왕 게을러지는거 조금 더 게을러지자. 이 스크립트는 폭이 640보다 넓은 걸 모두 640x480 크기로 바꿔주는데, 앞에서 일단 우리가 접었던 욕망을 떠올려보자. 이 스크립트는 위 아래로 길쭉한 파일도 640 x 480, 즉 옆으로 넓죽한 이미지로 만들어버린다. 이건 우리가 원하는게 아니다. 길쭉한 것은 손대지 않게 하자.

그럼 이 스크립트가 추가로 할 일은, 이 이미지가 넓죽이인지 길쭉이인지 알아내는 것, 이건 어떻게? 폭(width)이 크냐 높이(height)가 크냐를 비교해보면 되겠지. 위 스크립트는 이미지 폭만 알아냈는데, 높이를 알아내는 부분을 추가하자. 역시 일단 지금은 복사&붙이기(Copy&Paste).

imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`

스크립트를 이렇게 바꾼다.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
    이미지높이를 알아내고,
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         한다.
    fi
done

컴퓨터 말로 바꾸기 시작.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         한다.
    fi
done

이미지가 넓다면 [ 폭 > 높이 ] 이다.
if [ 폭 -gt 높이 ]; then
    바꾸기.
fi

이번 단계의 최종 결과.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ $imgwidth -gt $imgheight ]; then
              convert -resize 640x480 *.png
         fi
    fi
done

--------

이제 다음 단계 : 위아래로 길쭉한 모양일 경우, 폭은 640, 높이는 비율을 맞춰 크기 조정하기.

자, 이제 컴퓨터에게 계산을 좀 시키자. 2편에서 살짝 나왔지만, 위아래로 길쭉하고 폭이 640보다 큰 이미지를 640x???로 변형한다면, 새 높이는?

원래 높이 : 원래 폭 = 새 높이 : 640
새 높이 = 원래 높이 곱하기 640 나누기 원래 폭

새 높이를 계산해서 new_height 라는 곳(변수,variable)에 써놓기로 한다면, 코드는 아래처럼 된다.

new_height=$(( ($imgheight * $640) / $imgwidth ))

식이 저렇게 되는건 bash 라는 녀석이 까칠하기 때문이니 그냥 저런가보다 하세요. -_- 저대로 복사해 붙여넣길. 띄어쓰기도 중요하므로.

자, 스크립트 코드는 이렇게 바꾸자.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         이미지가 넓으면
              convert -resize 640x480 *.png
         하고, 안그러면
              새 높이를 계산한 후,
        
     convert -resize 640x새높이 *.png
         한다.
    fi
done

자, 새로운게 나올 타이밍. "~하면 ~한다." 가 if... then.. fi 라면, "~하면 ~하고, 아니면 ~한다."는 if... then... else... fi.

if [ 조건 ]; then
    참일때 할일
else
    거짓일때 할일
fi

스크립트 코드에 넣자

#! /bin/bash

for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ 이미지가 넓다 ]; then
              convert -resize 640x480 *.png
         else
              새높이를 계산한 후
        
     convert -resize 640x새높이 *.png
         fi
    fi
done

자, 이제 코드를 완성하자.

#! /bin/bash
for img in *.png
do
    imgwidth=`identify -ping $img | cut -f 3 -d " " | cut -f 1 -d "x"`
   
imgheight=`identify -ping $img | cut -f 3 -d " " | cut -f 2 -d "x"`
    if [ $imgwidth -gt 640 ]; then
         if [ $imgwidth -gt $imgheight ]; then
              convert -resize 640x480 *.png
         else
              new_height
=$(( ($imgheight * $640) / $imgwidth ))
              convert -resize 640x$new_height *.png
         fi
    fi
done

자, 이것으로 우리가 원하는 작업을 한번에 해결해주는 스크립트를 일단 완성했다. 앞으로 살면서 "이 디렉토리에 있는 모든 PNG이미지의 크기를 640x480 으로 바꾸고 싶어. 더 작은 건 냅두고, 위아래로 길쭉한 것은 폭만 640으로 하고." 이런 일이 생길때는? 그저 i m g _ r e s i z e 라고 10 글자 타이핑 후 엔터 치면 끝난다는 거~.

기쁘다. 이제 내가 해야 할 단순반복노동 중 한 가지가 줄었다. 하지만, 여기까지 내친김에 더 욕심이 난다. 이 스크립트는 현재,
1. PNG 이미지만 처리할 수 있다.
2. 원하는 폭이 640 x 480 이 아닌경우는 파일을 열어 수정하고, 다시 실행해야 한다. 바뀔 때마다.
3. 원본 파일을 따로 유지해두고 싶은데 그러려면 어딘가에 수동으로 파일들을 복사해줘야 한다.
4. 버그가 있(을 것이)다.

자, 4번을 빼고는 인정할 수 있을 것 같다. 그럼 그건 이 다음편에.
(근데 다른 일을 좀 해야 하니 다음편은 조금 더 늦을 듯 -_-)






진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크
2007/07/13 22:13 2007/07/13 22:13
Trackback Address :: http://blog.jinbo.net/h2dj/trackback/477
Name
Password
Homepage
Secret