[Python] 이미지 파일 크기 한꺼번에 줄이기 - os와 PIL

양말·2023년 3월 15일
0

시스템프로그래밍

목록 보기
3/7

설문지 775장


설문지를 받았는데 775장의 jpg 파일이다. 다 합쳐서 pdf를 땄더니 크기가 300Mb를 넘는다.
크기를 줄여야할 필요가 생겼다.. 하나하나 다 크기를 줄이는 건 귀찮으니까 크기를 줄여주는 프로그램을 만들어보자.
해상도는 그렇게 중요하지 않아서 최대한 축소하는 걸 목표로 하겠다.

system call을 다룰 때는 간편한 파이썬으로 접근을 한다.

오류 발견

다행히 인터넷에 나와 같은 고민을 하는 사람이 꽤나 있는지 내가 원하는 코드를 발견해서 그대로 조금 수정해서 돌렸다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
    
import os
from PIL import Image
    
path = 'C:/Users/ywonc/Documents/---/---/---/' # 원본 폴더
resultPath = 'C:/Users/ywonc/Documents/---/---/---!/' # 대상 폴더

if not os.path.exists(resultPath):
        os.mkdir(resultPath)
    
list = os.listdir(path)
    
list.sort()

for filename in list:
    
    file = path + filename
    
    img = Image.open(file)
    img.save(os.path.join(resultPath, filename), 'JPEG', qualty=70) # 품질 85로 줄이면서 용량 줄이기

내가 이미지 775장을 어디서 얻어왔는가 하면
1. 아이패드로 pdf 출력
2. 아이클라우드에서 윈도우로 해당 pdf 다운
3. pdf 이미지(jpg)로 변환
4. 5의 배수 항목들만 포토샵으로 편집 후 저장

이 상태에서 위 프로그램을 돌리니 포토샵으로 돌렸던 5의 배수 항목들(5, 10, 15, 20... 번째 이미지)만 사이즈가 줄어들었다. 나머지는 오류!

오류 해결 1

시스템프로그래밍 OT 시간에 교수님이 우리 수업에서 무엇을 배우는지 알려주셨다. 가만 들어보니 파일을 다루는 프로그램을 만드는 방법을 배우는 수업이라니 바로 내가 시도했던 프로그램이다.
포기하고 있었는데 혹시나 싶어 교수님께 코드와 오류를 설명했다. 교수님은 헤더파일에서 문제가 생긴 것 같다고 알아보라고 하셨다.

오류 해결 2

시스템프로그래밍 2주차 수업 시간에 리눅스 명령어 중 head를 배웠는데 그때 교수님이 말씀하신 헤더파일(연관이 없는 거 같긴 한데)이 생각나서 리눅스에서 파일을 한번 살펴볼까 생각했다.
이런 일이 있었다.

이것저것 해결책을 찾던 중
이런 글도 보았다.
바로 이 글을 보고 엇 thumbnail을 한번 써볼까? 해서 써봤더니

#!/usr/bin/python
# -*- coding: utf-8 -*-
    
import os
from PIL import Image
    
path = 'C:/Users/ywonc/Documents/---/---/---/' # 원본 폴더
resultPath = 'C:/Users/ywonc/Documents/---/---/---?/' # 대상 폴더

if not os.path.exists(resultPath):
        os.mkdir(resultPath)
    
list = os.listdir(path)
    
list.sort()

#여기만 살짝 바뀌었다.
#size = 1240, 1754
size = 620, 877
for filename in list:
    
    file = path + filename
    
    img = Image.open(file)
    #여기만 살짝 바뀌었다.
    img.thumbnail(size, Image.ANTIALIAS)
    img.save(os.path.join(resultPath, filename))
    #img.save(os.path.join(resultPath, filename), 'JPEG', qualty=70) # 품질 85로 줄이면서 용량 줄이기

오! 이게 돌아가다가..!

여기서 오류가 떴다.
cannot write mode RGBA as JPEG를 찾아보니

이런 결과를 찾아낼 수 있었다!

포토샵으로 편집하는 게 투명도와 관련이 있나보다.
근데 이게 save에서 속성으로 퀄리티를 조정하는 것에서 막혔던 초기 문제점의 근본 해결방법인지는 모르겠다..

해결 완료

#!/usr/bin/python
# -*- coding: utf-8 -*-
    
import os
from PIL import Image
    
path = 'C:/Users/ywonc/Documents/박정우/박정우논문/tis/' # 원본 폴더
resultPath = 'C:/Users/ywonc/Documents/박정우/박정우논문/tmp/' # 대상 폴더

if not os.path.exists(resultPath):
        os.mkdir(resultPath)
    
list = os.listdir(path)
    
list.sort()

#size = 1240, 1754 #1/2배
size = 620, 877 #1/4배
for filename in list:
    
    file = path + filename
    
    img = Image.open(file)
    img.thumbnail(size, Image.ANTIALIAS)
    img = img.convert("RGB") #여길 추가
    img.save(os.path.join(resultPath, filename))
    #img.save(os.path.join(resultPath, filename), 'JPEG', qualty=70) # 품질 85로 줄이면서 용량 줄이기
img = img.convert("RGB")

이걸 추가해주니 바로 문제가 해결되었다.

쭉쭉쭉... 자동으로 이미지 크기를 줄이는 모습을 보니 아주 뿌듯하다!

300MB가 넘었던 게 41MB로 줄었다!

profile
코끼리

0개의 댓글