본문 바로가기

파일 형식 백과사전

사진을 잘라냈는데 용량이 그대로이거나 오히려 커졌다면

메일에 첨부하려고 사진에서 필요 없는 부분을 잘라냈습니다. 화면에서 보이는 크기는 확실히 작아졌는데, 파일 크기는 기대만큼 안 줄었습니다. 어떤 때는 원본보다 커져 있기도 합니다.

자르기는 픽셀을 덜어 내는 일이지만, 저장은 남은 부분을 처음부터 다시 압축하는 일입니다. 그래서 결과가 픽셀 수만으로 정해지지 않습니다. 같은 사진에서 자를 자리와 저장 품질만 바꿔 가며 직접 재 봤습니다.

사진 자르기 용량 실측 표. 2400x1600 품질 85 원본이 512,018바이트다. 같은 1200x800 크기로 잘라도 매끈한 하늘 쪽을 남기면 8,987바이트로 1.8퍼센트, 복잡한 수풀 쪽을 남기면 238,628바이트로 46.6퍼센트가 된다. 같은 자리를 품질 98로 저장하면 373,960바이트로 73퍼센트, 가장자리만 잘라 내고 품질 98로 저장하면 676,751바이트로 132.2퍼센트가 되어 원본보다 커진다. 측정 환경은 윈도우 11, 파이썬 3.14.6, Pillow 12.2.0

같은 크기로 잘랐는데 용량이 26배 차이 났습니다

위쪽은 하늘처럼 매끈하고 아래쪽은 수풀처럼 잔결이 많은 2400 x 1600 사진을 준비했습니다. 여기서 똑같이 1200 x 800씩, 자리만 달리해 두 군데를 잘랐습니다. 픽셀 수는 둘 다 원본의 25퍼센트입니다.

무엇을 남겼나 픽셀 수 파일 크기 원본 대비
원본 2400 x 1600 512,018 B 기준
매끈한 하늘 쪽 1200 x 800 8,987 B 1.8 %
복잡한 수풀 쪽 1200 x 800 238,628 B 46.6 %

픽셀은 똑같이 4분의 1인데 결과는 1.8퍼센트와 46.6퍼센트로 갈렸습니다. 용량을 정하는 것은 남은 픽셀의 개수가 아니라 그 픽셀들이 얼마나 복잡한가입니다.

JPEG는 옆 칸과 색이 비슷하면 그 구간을 뭉뚱그려 짧게 적습니다. 하늘처럼 색이 완만하게 변하는 면은 뭉뚱그릴 데가 많아 거의 아무것도 안 남습니다. 반대로 잎사귀와 잔가지가 뒤엉킨 면은 옆 칸마다 색이 튀어서 줄일 여지가 없습니다.

그래서 인물 사진에서 배경만 잘라 내면 크게 안 줄고, 반대로 복잡한 배경을 잘라 내고 인물만 남기면 확 줄어듭니다.


커지는 경우는 저장 품질이 올라갔을 때입니다

같은 수풀 자리를 품질만 98로 올려 저장했더니 238,628바이트가 373,960바이트가 됐습니다. 픽셀은 그대로인데 파일만 커진 것입니다.

더 흔한 경우는 이쪽입니다. 가장자리만 살짝 잘라 내고 편집 프로그램의 기본값대로 높은 품질로 저장했습니다.

처리 픽셀 수 품질 파일 크기 원본 대비
원본 2400 x 1600 85 512,018 B 기준
가장자리만 잘라 냄 2160 x 1440 98 676,751 B 132.2 %

픽셀을 19퍼센트나 덜어 냈는데 파일은 원본보다 32퍼센트 커졌습니다. 자르기가 문제가 아니라 저장 품질이 문제였습니다.

이런 일이 벌어지는 이유는 원본이 이미 품질 85로 한 번 압축된 상태였기 때문입니다. 그 상태에서 품질 98로 다시 저장하면, 압축하면서 생긴 얼룩까지 충실하게 보존하느라 자리를 더 씁니다. 화질이 좋아지는 것이 아니라 이미 잃은 것을 더 정성껏 담는 셈입니다.

줄이려면 이 순서로

1. 잘라낸 뒤 저장 품질을 확인합니다. 대부분의 편집 프로그램은 저장할 때 품질 슬라이더를 보여 줍니다. 원본보다 높게 두지 않는 것이 기본입니다.
2. 그래도 크다면 픽셀 자체를 줄입니다. 자르기가 아니라 크기 조정입니다. 긴 변을 1600이나 2000으로 맞추면 눈에 띄는 손해 없이 확 줄어듭니다.
3. 자르기와 크기 조정을 한 번에 하고 저장은 마지막에 한 번만 합니다. 자르고 저장하고 다시 열어 줄이고 또 저장하면 그때마다 화질이 깎입니다.

여러 장을 한꺼번에 처리한다면 코드로 자르고 품질을 지정해 저장할 수 있습니다.

from PIL import Image

with Image.open("photo.jpg") as im:
    cut = im.crop((300, 200, 1500, 1000))     # 왼쪽, 위, 오른쪽, 아래
    print(im.size, "->", cut.size)
    cut.save("photo_cut.jpg", quality=85, optimize=True)

quality를 적지 않으면 라이브러리 기본값으로 저장되면서 원본과 달라집니다. 자를 때는 이 값을 반드시 지정하시는 편이 좋습니다.


같이 보면 좋은 기준

픽셀을 줄이는 것과 품질을 낮추는 것 중 어느 쪽이 이득인지는 둘을 각각 조절해 잰 글에 수치로 있습니다. 품질 값을 얼마로 두는 것이 적당한지는 옵션별로 용량을 잰 글에서 확인하실 수 있습니다.

 

자르고 나서 파일 크기가 이상하다면 저장 대화상자의 품질 값부터 보세요. 픽셀을 아무리 덜어 내도 그 숫자가 올라가 있으면 결과는 반대로 갑니다.

 

위 바이트는 윈도우 11에서 파이썬 3.14.6과 Pillow 12.2.0으로 같은 원본을 자리와 품질만 바꿔 저장해 얻은 값입니다. 사진의 내용에 따라 비율은 달라지므로 방향만 참고하시면 됩니다.