책 쓰는 엔지니어

사진 수 천 장을 인스타그램에 올리기 좋게 편집하기 본문

일반인을 위한 업무자동화

사진 수 천 장을 인스타그램에 올리기 좋게 편집하기

halfbottle 2020. 5. 31. 12:32
728x90
반응형

  git pull origin master 를 한 번 실행하시고 읽기 바랍니다.   깃허브 레포지토리에 있는 코드를 컴퓨터에 설치하는 방법은 이전 글을 참고해 주시기 바랍니다.


  반갑다. 한 달이 넘는 시간이 흘러 드디어 되돌아왔다. 그간 가장 고민거리였던 것은, "과연 어떤 소재로 글을 써야 독자 여러분들의 삶의 질 향상에 가장 실용적인 도움이 될 수 있을까?"였다. 오늘은 조금 더 일상에서 도움이 될 수 있는 소재를 가져왔다.

 

필자 인스타그램 화면 캡처

 

  인스타그램은 기본적으로 정사각형 사진을 올릴 때 가장 예쁘게 나온다. 썸네일도 정사각형으로 배치되고, 아무런 옵션 없이 이미지를 올리면 저절로 정사각형 모양으로 테두리가 잘려나간다. 물론 정사각형이 아닌 이미지도 업로드가 가능하긴 하지만 여기에도 또 다른 문제가 있다.


  인스타그램에서 여러 장의 사진을 동시에 포스트 하는 과정은 아래와 같이 동작한다.


  1. 맨 처음 선택한 사진의 가로세로 크기를 인식한다.
  2. 그 크기와 동일한 크기의 프레임(액자)을 형성한다.
  3. 여러 장의 사진을 선택하면 똑같은 크기의 프레임이 여러 개 생긴다.
  4. 프레임을 벗어난 영역은 삭제된다.


  이 말인즉슨, 가로로 길쭉한 이미지와 정사각형 이미지를 동시에 올리면 둘 중 하나는 잘려나간다는 것이다. 아래 예시를 살펴보자.

 

(좌) 멀쩡히 나온 이미지 (우) 아래위가 잘려나간 이미지

 

  좌측 사진은 가로로 긴 사진이었고 우측 사진은 정사각형 이미지였다. 가로로 길쭉한 사진을 먼저 선택했기 때문에 가로로 길쭉한 형태의 프레임으로 고정되었고, 정사각형 이미지는 아래위가 잘려나가 버렸다. 이런저런 이유로 인스타그램을 제대로 활용하려면 정사각형 이미지를 사용할 수밖에는 없는 것이다.

 

  그런데 매번 이미지를 정사각형으로 편집하는 것도 귀찮지 않은가? 조금 극단적인 예시를 들어 보자.


  여러분이 이제 임종이 얼마 남지 않은 상황이라고 생각해보자. 폰에 저장된 모든 사진들을 인스타그램에 올려 지인들과 후손들에게 추억되고 싶은 마음이 생겼다. 그런데, 그 사진 중 대부분은 정사각형 크기가 아니라 가로로 길쭉하거나 세로로 길쭉하다. 임종을 앞둔 그 순간에 수 만 장의 사진을 일일이 편집해 정사각형으로 만들고 있을 시간이 있겠는가? 이런 일은 코딩으로 해결하면 된다.
      


  파이썬에서 이미지를 다루는 방법은 여러 가지가 있지만 필자는 PIL 라이브러리를 사용한 방법을 가장 선호한다. 거창한 이유가 있어서 그런 것은 아니고, 학부 1학년 때 처음으로 만져 본 라이브러리가 PIL이었기 때문이다.


  PIL은 Python Image Library의 줄임말이다. 그런데 PIL은 어느 순간부터 더 이상 업데이트되지 않고 있다. 무슨 이유에서인지 PIL 프로젝트를 이끌어가던 팀은 2009년 11월 15일을 마지막으로 더 이상 PIL의 업데이트와 유지보수를 하지 않고 있다. 벌써 숨이 끊어진 지 10년이 된 라이브러리지만 많은 사람들이 PIL을 아직 사용하고 있다. 강력하고, 편리하며, 사용법이 쉽기 때문이다.


  다행히 Alex Clark이 주도하는 Pillow 팀이 PIL을 계승하고 있다. PIL에서 포크 된 pillow팀은 기존 PIL과 달리 최신 버전에서도 잘 돌아가는 데다가 도큐멘테이션도 아주 잘 되어 있으므로 사용법이 궁금할 때마다 필요한 부분만 바로바로 찾아서 공부할 수 있다. 여기에는 아마 독자 여러분에게 필요한 모든 기능이 전부 탑재되어 있을 것이다.


  Pillow 설치는 pip을 이용하여 쉽게 할 수 있다. 이전 글에서 독자 여러분이 파이썬과 git bash를 모두 설치했고, 환경설정도 끝난 상태라고 가정하고 설치방법을 안내한다.


  우선 git bash 던 cmd건 편리한 것을 열어 준다. 그리고 아래 명령어를 입력해 주자.


  pip install Pillow

 

 

pip install Pillow

 

  필자의 컴퓨터에는 이미 Pillow가 설치되어 있기 때문에 관련된 메시지가 나왔다. Pillow가 설치되지 않은 컴퓨터라면 설치 과정이 표기될 것이다. Pillow가 설치되었다면 이제 준비과정은 끝났다.

 

  image_square 폴더 안에 input_images라는 이름의 폴더를 만들고 여기에 변환하고자 하는 이미지들을 집어넣자. 그리고 git bash를 열어 준다.

 

마우스 우클릭으로 git bash 실행

 

  git bash에 아래 명령어를 입력하면 작업이 저절로 진행된다.


  python main.py

 

output_images라는 폴더가 새로 생겼다

 

 

결과물

 

 

  참고로 필자의 아뜰리에 페이지에서도 이 코드를 이용해 만든 정사각형 이미지를 사용했다.

 

 

치즈케익 스튜디오

아트워크 그룹 치즈케익 스튜디오

cheesecake.quv.kr

 


 

7~14번 줄

 

  7, 8번 줄을 주목하자. 8번 줄은 방금 설치한 Pillow에서 Image라는 모듈을 불러오는 과정이다. 프로젝트명은 Pillow지만 코드에서 불러올 때에는 PIL이라고 기재하면 된다.


>>>  from A import B

 

  위 문법은 A라는 곳에서 B를 불러온다는 뜻이다. 7번 줄은 단순히 import os라고 기재되어 있다. 이 둘의 차이를 잘 비교해 보자.


  10번 줄은 input directory를 정의하고 있다. 이 코드는 input_images라는 폴더 안에 있는 이미지들을 불러와 작업을 수행하고, 결과물을 output_images라는 폴더에 저장할 것이다.


  14번 줄에서는 output_dir이라는 이름의 폴더를 만들고 있다.


  os모듈은 이름값을 한다. os와 소통하면서 이런저런 정보와 명령을 주고받을 수 있다. os.mkdir() 함수는 워킹 디렉터리 내부에 새로운 폴더를 만들라는 명령을 os에게 전달한다.


>>>  os.mkdir(output_dir)


  위 명령어는 워킹 디렉터리에 output_dir이라는 이름으로 폴더를 하나 만들라는 뜻이 된다. output_dir에는 "output_images"라는 문자열이 저장되어 있으므로 위 명령어를 실행하면 폴더 안에 "output_images"라는 폴더가 새로 생겨난다.


  그런데, 만약에 "output_images"라는 폴더가 이미 있는데 똑같은 이름의 폴더를 또 만들라는 명령을 보내면 어떻게 될까? 에러가 뜨면서 튕기게 된다. 13번 줄은 이를 방지하기 위한 코드다.


  예전에도 설명하고 넘어간 적이 있는데, os.listdir()은 워킹 디렉터리 내부의 내용물을 보여주는 기능을 수행한다. 상세한 건 구글에 파이썬 os 모듈이라고 검색해 보자.


  위 코드는 워킹 디렉터리 내부의 내용물을 훑어보고, 그 내용물 안에 output_dir이라는 이름을 가진 폴더가 이미 존재하는지 아닌지를 파악하는 코드다. 즉 13번 줄과 14번 줄을 합쳐서 해석하면 아래와 같은 뜻이 된다.


  "혹시 이미 output_dir이라는 폴더가 있나 확인 좀 해 봐. 있으면 넘어가고, 없으면 그 이름으로 폴더 하나 만들어 줘."

 

16번 줄

 

  16번 줄은 input_dir 내부의 목록을 불러오고 있다. 즉, 정사각형으로 바꾸고자 하는 사진 파일 목록을 만드는 코드다.

 

18 ~ 38 줄

 

  18번 줄에서 for 문을 실행한다.


  19~21번 줄은 이미지 파일이 아닌 파일을 걸러내기 위한 코드다. 19번 줄은 파일 이름을 "."을 기준으로 잘게 쪼개 준다. 상세한 것은 파이썬 split()이라고 구글에 검색해 보자.


  20번 줄에서는 파일 이름의 확장자를 저장한다.


  21번 줄에서는 확장자가 이미지 파일인지 아닌지를 검사한다. 확장자는 string이므로 in 연산자를 사용하면 쉽게 판별할 수 있다. in 연산자는 포함관계를 분석하는 연산자다.


>>>  A in B


  A가 B에 포함되어 있으면 in 연산자는 True를 리턴하고, 반대 경우에는 False를 리턴한다.

 

23 ~ 24 라인

 

  22번 줄에서는 PIL의 Image 라이브러리를 활용해 이미지를 불러오고 있다. Image.open()은 이미지 파일을 불러오는 코드다. 상세한 것은 구글에 파이썬 Image.open()이라고 검색해 보자.


  23번 줄은 이미지의 사이즈를 확인하고 있다. x에는 가로길이, y에는 세로 길이가 저장된다.


  이미지를 정사각형으로 바꾸려면 약간의 수학이 필요하다. 하지만 겁먹지는 말자. 초등학생도 할 수 있는 계산이다.

 

가로로 긴 이미지의 여백 계산

  가로로 긴 이미지를 정사각형으로 변환할 경우 아래위에 흰색 여백을 삽입해야 한다. 이 여백의 높이는 위와 같은 간단한 수식으로 계산할 수 있다. 새로운 가로 세로 길이는 모두 조금 더 긴 축인 x로 고정된다. 그러면 전체 여백은 새로운 길이 x에서 원본 이미지 높이를 뺀 x-y 만큼이 된다. 아래위 여백은 전체 여백의 절반에 해당한다. 이 값은 (x-y)/2가 된다.

 

세로로 긴 이미지의 여백 계산

 

    비슷한 논리로 세로로 긴 이미지의 좌우 여백은 (y-x)/2가 된다. 어떤가, 뺄셈과 나눗셈 밖에 없었다. 정말로 초등학생도 할 수 있는 계산이다.

 

24 ~ 31번 줄

 

  위 계산을 수행하는 코드는 24~31번 줄에 들어간다.

 

33~35번 줄

 

  33번 줄에서는 여백에 들어갈 배경색을 입력한다. 필자는 흰색이 깔끔해서 white로 했는데, 다른 색을 원한다면 적어 주면 된다. PIL에서 어떤 영문자를 색깔로 인식 가능한지는 Pillow 도큐먼트를 읽어보기 바란다.


  34번 줄에서는 온통 하얀색으로 채워진 정사각형 이미지를 만든다.


  35번 줄에서는 원본 이미지를 이 흰색 이미지 위에 덮어 씌운다. 이 과정에서, 여백을 사이에 두고 이미지가 정중앙에 들어갈 수 있도록 앞서 계산한 x_offset과 y_offset을 반영해 준다.  

 

37~ 38 줄

 

  37번 줄에서는 저장할 파일 이름을 손봐서 무조건 png파일로 만든다. 예를 들면 아래와 같은 파일이 있다고 치자.


>>>  test.jpg

 

  위를 쪼개어 test라는 글자만 남기고, 이 뒤에 .png를 붙여 test.png라는 글자를 만든다. 그런데 또 아래와 같은 경우가 있을 수도 있다.


  test.winter.me.on.car.jpg


  이 경우 "."을 기준으로 글자를 쪼개 확장자를 파악하려면 좀 귀찮을 수 있다. 그런데 필자는 귀찮지 않으려고 코드를 짜는 것이므로 귀찮음을 감수할 생각이 없었다. 그래서 split()과 join()로 해결해 버렸다. 그게 37번 줄에 있다. 19번 줄과 37번 줄을 실행한 결과는 아래와 같다.

 

쪼갰다가 다시 이어 붙인다

  상세한 것은 구글에 파이썬 split()과 파이썬 join()이라고 검색해 보길 바란다. 본격적으로 이미지를 조작하는 코드를 소개하고 싶은데 어떤 수요가 있는지 잘 모르겠다.


  이번 글에 사용된 소스코드는 깃허브에서 무료로 다운로드하실 수 있습니다. Star도 하나씩 눌러주시면 감사드리겠습니다.

 

 

needleworm/automation_edu

learning materials for https://brunch.co.kr/magazine/autonormal - needleworm/automation_edu

github.com

  이 외에도 다양한 이미지 자동화 예제코드들이 준비되어 있습니다.

 

이미지 자동화 예시 (일부)

 

  이 내용들은 생능출판사를 통해 출판될 업무 자동화 책에서 소개합니다. 70개 정도의 실전 업무 자동화 예제 코드가 준비되어 있으며, 코딩을 한 번도 배워본 적 없는 분들께서도 쉽게 따라할 수 있는 책입니다. 현재 원고작업 중이며, 출시일정은 생능출판사로 문의 부탁드립니다.

 

 

치즈케익 스튜디오

아트워크 그룹 치즈케익 스튜디오

cheesecake.quv.kr

 

코딩하는 공익

하루 만에 3만여 명이 본 브런치 화제의 글 〈크롤러를 이용해 우체국 등기우편을 자동으로 정리해 보자〉의 주인공, ‘코딩하는 공익’ 반병현 작가의 첫 에세이. 단숨에 인기를 얻고 좋은 일��

book.naver.com

 

법대로 합시다

이 책은 실생활에 쓰이는 법학지식, 교양 수준의 법학지식, 법이 무엇인지 가볍게 접해 보고자 하는 사람들을 위한 교양서적의 성격을 띠고 있습니다. 경제적 풍요를 위해 재테크에 시간을 투자

book.naver.com

 

실전 민사소송법

이 책은 도서출판 해피로라를 통해 2017년 출간된 ‘실전 민사소송법’의 2판 격에 해당합니다. 2019년 연말까지의 최신판례가 업데이트되었습니다. 이 책은 변호사시험 또는 변리사시험을 준비��

book.naver.com

 

공학자의 지혜묵상

공학자가 지혜를 다루는 성경인 잠언과 전도서를 묵상한 글입니다. 논리와 지성이 신학을 만나 생기는 화학반응을 고스란히 녹여보았습니다.

www.bookk.co.kr

 

 

 

 

728x90
반응형
Comments