차곡차곡 성 쌓기
article thumbnail

1. All-in-JPEG 대공사

1.1 변경 사항

변경 사항은 다음과 같다.

  1. 프레임(SOF ~ EOI 전)만 저장해오던 방식에서 메타 데이터가 들어있는 APP1 Exif 데이터도 함께 추가 (썸네일 포함)
  2. 기존 All in JPEG Extension에 들어있던 텍스트 데이터를 EOI 뒤로 추가.
  3. 추가된 데이터들을 구별할 수 있도록 커스텀 마커 추가 (표 참조)
마커 이름 마커 데이터 용도
XOI (Extension of Image) 0xFF, 0x10 확장한 이미지 데이터의 시작을 표시함
XOT (Extension of Text) 0xFF, 0x20 확장한 텍스트 데이터의 시작을 표시함
XOA (Extension of Audio) 0xFF, 0x30 확장한 오디오 데이터의 시작을 표시함

 

1.2 변경 된 포맷으로 코드 변경

발생한 문제

1. 약 80%의 확률로 프레임을 추출하는 함수에서 바이트 어레이를 자르는 코드에서 index 에러 발생

    원인 : 추가된 APP1의 데이터 안에 있는 썸네일의 SOF까지 찾고 있었음.

    해결 : SOF를 찾는 루프를 돌 때 끝 지점은 EOI까지라고 명시해줌.

 

2. 편집 창에서 사진을 추가할 때 사진의 화질이 급격히 나빠짐

원인 : 문제 1에서 끝 지점을 EOI라고 명시 해줘서 문제 발생. 썸네일에 존재 하는 EOI를 전체 이미지의 끝이라고 인식

해결 : EOI를 2번 찾을 때 while문의 break를 걸어주고, 탐색은 전체 이미지 사이즈의 반 크기만큼 루프 진행 후 빠져나옴

- 썸네일을 제외하고 SOI와 EOI는 더 이상 나오지 않음

- 메타 데이터 크기는 전체 이미지 데이터의 약 5%를 차지하기 때문에 절대 50%를 넘어가지 않음

 

3. All-in-jpeg에 넣었던 사진을 단일 추출을 하고 다시 그 사진을 추가하려고 하면 문제 발생

원인1 : 단일 사진 추출할 때 APP3 extension이 들어가 있어 All-in JPEG포맷으로 인식하는 것 같음

-> 아님. 뷰어에서 보면 일반 JPEG 사진으로 인식함.

 

원인2 : 메타 데이터를 추출할 때 All-in JPEG이여도 APP3 데이터를 추출하지 않아서 문제. APP3 마커는 찾지만 데이터 크기 찾는 코드가 잘못 되어 있어음

해결 : 2바이트 끊어 읽어 방식에서 원래 크기인 4바이트를 읽어주어 정상적인 데이터 사이즈를 알아냄.

 

3-1. Exif 포맷이나 MP 포맷을 알아보니 모두 데이터 크기를 2바이트로 저장함. 그래서 모두 2바이트로 바꿈

// 변경 전
	app3DataLength = ((jpegBytes[app3StartIndex + 2].toInt() and 0xFF) shl 8) or
		((jpegBytes[app3StartIndex + 3].toInt() and 0xFF) shl 0)
    
// 변경 후
	app3DataLength = byteArraytoInt(jpegBytes, app3StartIndex +2)

    fun byteArraytoInt(byteArray: ByteArray, stratOffset : Int): Int {
        var intNum :Int = ((byteArray[stratOffset].toInt() and 0xFF) shl 24) or
                ((byteArray[stratOffset+1].toInt() and 0xFF) shl 16) or
                ((byteArray[stratOffset+2].toInt() and 0xFF) shl 8) or
                ((byteArray[stratOffset+3].toInt() and 0xFF))
        return intNum
    }

 

4. All-in JPEG에 넣었다가 단일 사진을 추출하면 0.01 MB의 크기가 없어짐. 뿐더러 위치 정보가 없어짐

데이터는 총 600 bytes 가량 없어지는 것을 확인

5. JPEG 분석 웹 사이트에 All-in JPEG 사진을 올리면 분석하지 못함.

 

 

 

2. 알아봐야 하는 것

Q. APP1의 exif 포맷 구조 자세히 알아보기. 썸네일 구조 특히. 썸네일 사이즈의 크기는 분명 maximum이 있을 것이다. 썸네일 크기의 위치는. 썸네일만 지우면 되는 것이 확실한지

 

Q. APPn의 보편적인 구조. header String (식별자) 

 

Q. 왜 그 중 APP3를 썼나. 충돌이 일어나지 않는지.

728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!