PNG / JPEG(JPG)의 차이

Donghee Lee·2022년 9월 26일
0

Software Engineering

목록 보기
5/9
post-thumbnail

PNG / JPEG(JPG)의 차이


바쁜 사람들을 위한 PNG / JPG의 차이

가볍고, 육안으로 구분이 잘 안될정도의 화질을 유지하면서 사용하고 싶다면 JPG를 사용하여 파일 사이즈의 부담을 줄이고 /
투명한 배경이 필요하거나, 고화질의 이미지를 필요로 한다면 PNG를 사용하면 될 것이다.


‼️취준생이 작성한 글이므로 정확하지 않은 정보가 있을 수 있습니다!

PNG란?

Photable Network Graphics의 약자에요.
이는 비손실 그래픽 파일 포맷으로 용량이 jpeg 보다 크고, 품질이 더 좋습니다.
투명한 배경화면을 표현할 수 있으며 고화질의 이미지가 필요할 때 사용

JPG란?(=JPEG, 제이펙)

Joint Photographic Experts Group의 약자에요.

이미지를 압축시킬 때 일부 데이터를 날려버리는 손실 압축 기법의 표준입니다.
이 기법(알고리즘)은 데이터를 줄이기 위해 양자화를 하게 되는데

여기서 양자화는
자연스러운 색상을 단순화 시키는 것으로 양자화를 하면 색상수가 줄게 되는데 이 때 데이터 손실이 발생한다고 말합니다.

또한 jpeg는 흰색 배경을 가집니다.


실제 프로젝트 개발 시 서버에서 png로 내려오는 이미지 파일이 있었는데
이를 디스크 캐시에 저장하고 다시 불러오면 jpeg 형식으로 되어 흰색 배경이 생겼었는데요.

이 때, 디스크 캐시에 저장 시 렌더링을 오리지널 이미지로 하여 흰색 배경을 없앨 수 있었습니다.

if !fileManager.fileExists(atPath: filePath.path) {
            debugPrint("경로에 파일이 존재하지 않을 때")
            //api response
            guard let url = URL(string: imgUrl as String) else { return }
            DispatchQueue.global().async {
                if let data = try? Data(contentsOf: url), let newImage = UIImage(data: data) {
                    //캐시 저장
                    ImageCacheManager.shared.setObject(newImage.withRenderingMode(.alwaysOriginal), forKey: NSString(string: imgUrl.lastPathComponent))
                    fileManager.createFile(atPath: filePath.path, contents: newImage.withRenderingMode(.alwaysOriginal).pngData(), attributes: nil)
                    completion(.success(newImage))
                }
            }
        }

추가정보

1. 아이폰 사진 촬영 시 이미지 파일 확장자는 heic

High Efficiency Image File Format의 약자에요.
이는 아이폰의 고유한 파일 형식으로 사진 파일을 더 압축하여 jpg보다 저장공간을 더 확보할 수 있습니다.

2. JPEG로 압축하는 과정 + 양자화를 곁들인

JPEG는 손실 부호화 방식, 비손실 부호화 방식이 있습니다.

비손실은 간단하게 생각하면 손실이 없이 부호화를 하니까 압축률이 낮을 수 밖에 없지만 그대로 보존될 것입니다.

그리고 손실 부호화 방식은 압축률이 당연히 높을 것이고, 원본 그대로 보존될 수 없겠죠?

우선 자주 쓰이는 손실 부호화 방식에 대해 알아봅시다.

JPEG 압축 기술의 핵심이라는데...

이 기술은 임의의 데이터 배열을 코사인 함수의 합으로 표현할 수 있다는 성질을 이용합니다.

여기서 데이터 배열 f는 코사인 함수의 합으로 표현한 정규식입니다.

여기서 코사인 함수의 진폭 F를 DCT 계수(coefficient)라고 하고, 새로운 배열 F를 구하는 것을 DCT라고 합니다.

함수의 진폭 F(=DCT 계수)를 구하는 방법은

다음과 같은 정규식으로 표현할 수 있는데 여기서 DCT 계수를 이용해 원래 데이터 f를 구하는 것을 IDCT(Inverse Discrete Cosine Transform)이라고 합니다.

예를 들어, N개의 데이터 f를 DCT로 변환하면 N개의 DCT 계수(F) 를 구할 수 있습니다.
DCT 계수 중 0차 계수는 다른 계수들과 달리 코사인 함수가 아니기 때문에, DC 계수라고 하고 나머지 계수는 AC 계수라고 합니다.

보통 DC 계수 값이 AC 계수 값에 비해 크기 때문에, JPEG 파일은 DC 계수와 AC 계수를 서로 다른 방법으로 저장합니다.

변환의 예를 좀 살펴보면

여기서 점선이 IDCT로 복원된 값이고, 실선이 원래 데이터입니다.
DCT 계수(F)를 많이 쓸 수록 원래 데이터에 근접한 결과를 얻을 수 있습니다.
근데 여기서 N=5인 경우를 보면 5차 DCT 계수까지만(즉, 5번째 F) 사용하여 IDCT를 해도 원본 데이터와 상당히 유사한 결과를 얻을 수 있는데요.

여기서 JPEN 압축의 비밀이 드러나게 됩니다!!!!

DCT 계수(F)를 모두 다 저장하지 않고, 일부만 저장하여도 나중에 복원할 때 원래 데이터와 상당히 유사한 형태로 복원이 가능할 수 있다는 뜻이져!!!

이와 같이 DCT 변환에 데이터 중 일부를 버리는 작업을 양자화라고 합니다!

그렇다면 복원할 때 사용한 DCT 계수에 따라 복원 정확도가 달라지게 되겠죠?

그럼 여기서 궁금한 점

위변조 한 사진을 찾아낼 때는 어떻게 제출된 자료가 위변조된 것인지 알 수 있을까?

앞서 DCT 계수를 가지고 복원할 경우 원본과 상당히 유사한 데이터로 복원할 수 있다고 했습니다.
이 때는 이미지에 대해 DCT 계수에 대한 히스토그램 분포로 판별할 수 있는데요.

다음 그림과 같이 일반적으로 한 번의 양자화를 거칠 경우, 연속적이고 부드러운 형태의 히스토그램 분포를 보이지만, 위변조 수행을 한 후 JPEG로 재인코딩 되어 중복 양자화가 수행된 경우, 이산적이고 주기적인 피크가 관찰되는 형태의 히스토그램 분포를 확인할 수 있습니다.

위변조에 대해선 관련 논문도 많지만 거기까지 하면 볼륨이 너무 커지고, 글 주제와도 점점 멀이지기 때문에 패스!


참고
제드님
참신러닝님
만들어보자님
관련논문
썸네일출처

profile
Better than Yesterday

0개의 댓글