본문 바로가기

파일 형식 백과사전

투명 배경 PNG를 JPG로 저장했더니 배경이 새까맣게, 원인과 깔끔한 해결법

배경이 투명한 로고나 아이콘 PNG를 JPG로 바꿨더니, 투명하던 부분이 온통 검은색으로

채워져 나오는 경우가 있습니다. 어떤 프로그램에서는 아예 저장이 안 되고 오류만 뜨기도 합니다.

 

파일이 망가진 것이 아닙니다. JPG라는 형식이 투명을 표현하지 못해서 생기는,

정해진 결과입니다.

왜 하필 검은색이 되는지와 배경을 원하는 색으로 깔끔하게 저장하는 방법을 실제 코드로 확인해 보겠습니다.

먼저 왜 이런 일이 생기는지부터

PNG는 각 픽셀에 색 정보와 함께 투명도(알파)라는 값을 하나 더 담습니다.

 

이 알파 덕분에 배경이 비쳐 보이는 투명 영역을 만들 수 있습니다.

그런데 JPG에는 이 알파를 담을 자리가 없습니다.

사진 압축에 특화된 형식이라 투명이라는 개념 자체가 없습니다. 그래서 투명 PNG를 JPG로 저장하려 하면 두 갈래로 문제가 나타납니다.


증상 1: 저장하려니 오류부터 납니다

파이썬 이미지 라이브러리 Pillow로 투명 PNG를 그대로 JPG로 저장하면,

다음과 같은 오류가 실제로 뜹니다.

OSError: cannot write mode RGBA as JPEG

여기서 RGBA는 빨강, 초록, 파랑에 알파(A)까지 네 가지 값을 가진 이미지라는 뜻입니다.

JPEG는 알파를 받을 수 없으니 저장을 거부하고 멈춘 것입니다. 오류 메시지가 곧 원인을 그대로 말해 주고 있는 셈입니다.

증상 2: 억지로 변환하니 배경이 검게

오류를 피하려고 알파를 떼어 내는 방식으로 변환하면(RGB로 강제 변환) 저장은 됩니다. 그런데 원래 투명이던 자리의 색을 확인해 보면 이렇게 나옵니다.

원래 투명이던 (0,0) 픽셀 색: (0, 0, 0)

(0, 0, 0)은 완전한 검은색입니다. 투명 픽셀은 눈에는 안 보였을 뿐

속에 담긴 색 값이 0으로 비어 있는데, 알파를 떼면 그 0이 그대로 드러나 검은 배경이 되는 것입니다.

위 비교 이미지의 가운데가 바로 이 상태입니다.


해결: 배경색을 먼저 깔고 그 위에 얹기

핵심은 투명 부분을 어떤 색으로 채울지 직접 정해 주는 것입니다. 흰 배경을 먼저 만든 다음, 알파를 마스크로 삼아 그 위에 이미지를 얹으면 됩니다.

from PIL import Image

im = Image.open("logo.png")        # 투명 배경 PNG
bg = Image.new("RGB", im.size, (255, 255, 255))  # 흰 배경 준비
bg.paste(im, mask=im.split()[3])   # 알파 채널을 마스크로 얹기
bg.save("logo.jpg", quality=95)

im.split()[3]이 알파 채널(네 번째 값)이고, 이것을 마스크로 넘기면 불투명한 부분만 배경 위에 그려집니다. 저장 후 같은 (0,0) 픽셀을 확인하면 이렇게 바뀝니다.

원래 투명이던 (0,0) 픽셀 색: (255, 255, 255)

투명이던 배경이 검정이 아니라 흰색으로 깔끔하게 채워졌습니다. 흰색 대신 다른 색을 원하면 (255, 255, 255) 자리에 원하는 색 값을 넣으면 됩니다.

코드 없이 처리하고 싶다면

이미지 편집 프로그램에서도 같은 원리로 해결합니다.

무료로 널리 쓰이는 GIMP 기준으로, 배경 레이어를 원하는 색으로 하나 깔고 그 위에 투명 PNG를 올린 뒤 JPG로 내보내면 됩니다. 포토샵이라면 배경 레이어를 흰색으로 채운 상태에서 저장하면 같은 결과가 나옵니다.

 

핵심은 도구가 무엇이든 투명 부분을 채울 배경색을 먼저 정하는 것입니다.

이 절차 없이 바로 JPG로 내보내면 프로그램이 임의로 검은색이나 흰색을 넣어 버립니다.

자주 묻는 질문

Q. 그냥 PNG로 두면 안 되나요?
투명이 필요하면 PNG가 맞습니다. JPG로 바꾸는 건 보통 용량을 줄이거나

투명을 지원하지 않는 곳에 올릴 때인데, 그럴 때만 배경색을 정해 변환하면 됩니다.

 

Q. 배경을 투명하게 유지하면서 용량도 줄이고 싶어요.
그럴 때는 JPG 대신 투명을 지원하는 WebP를 고려할 수 있습니다.

투명도 살리면서 JPG에 가까운 용량을 얻을 수 있습니다.

 

Q. 검은 배경으로 이미 저장해 버린 JPG는 되살릴 수 있나요?
어렵습니다. 투명 정보가 저장 시점에 사라졌기 때문에, 원본 PNG가 남아 있다면 그것으로 다시 변환하는 편이 확실합니다.

 

 

정리하면 이 문제는 오류가 아니라 JPG에 투명을 담을 자리가 없어서 생기는 자연스러운 결과입니다.

변환 전에 배경색 한 번만 정해 주면 검은 배경도, 저장 오류도 함께 사라집니다.

원본 PNG는 지우지 말고 남겨 두시면 언제든 다시 손볼 수 있습니다.