2011-09-07 2 views
2

Windows 데스크톱에서 사용자가 수행하는 "기록"작업 중에 많은 스크린 샷을 사용하는 응용 프로그램을 작성하고 있습니다.화면 캡처를 무손실로 압축하는 데 적합한 이미지 파일 형식

분명히 나는이 데이터를 가능한 한 효율적으로 저장하고 싶습니다.

처음에는이 작업을 수행하는 데 PNG 형식을 사용하는 것에 대해 생각했습니다. 그러나 나는 이것을 우연히 만났습니다. http://www.olegkikin.com/png_optimizers/

최상의 알고리즘은 GUI 아이콘 이미지의 3 ~ 5 % 개선 만 관리했습니다. 이것은 매우 실망스럽고 PNG를 사용하면 이전 프레임을 사용하여 압축률을 돕지 않기 때문에 더 잘해야 할 필요가 있음을 알 수 있습니다. 파일 크기는 시간에 따라 선형 적으로 증가합니다.

해킹 비트를 사용하여이를 해결하는 방법을 생각했습니다. 프레임을 나란히 몇 개의 그룹으로 저장하십시오. 예를 들어 하나의 1280x10240 이미지에 1280x1024의 10 개의 캡처 콘텐츠를 저장하면 압축을 통해 인접한 이미지 전체의 반복을 활용할 수 있습니다.

그러나이 문제는 PNG를 압축하는 데 사용되는 알고리즘이이를 위해 설계되지 않았기 때문입니다. 나는 임의로 1024 픽셀 간격으로 이미지를 배치하고 있으며 그 중 단 10 개만 한 번에 그룹화 할 수 있습니다. 몇 분 후에 PNG 사양을 스캔 한 후에 수집 한 내용에서 압축은 개별적인 스캔 라인 (필터링 됨)에서 작동하고 함께 청크 처리됩니다. 따라서 위 1024 픽셀의 정보를 아래에서 참조 할 수있는 방법이 없습니다.

그래서 애니메이션을 허용하도록 PNG를 확장하는 MNG 형식을 발견했습니다. 이것은 내가하는 일에 훨씬 더 적합합니다.

내가 걱정하는 한 가지는 이미지/애니메이션을 새로운 프레임으로 "확장"하는 것입니다. 내 응용 프로그램에서 데이터 생성의 본질은 새 프레임이 주기적으로 목록에 추가된다는 것입니다. 하지만이 문제에 대한 간단한 반 - 해결책은 최근에 생성 된 데이터를 캐시에 저장하고 점진적으로 10 개의 프레임마다 "애니메이션"을 생성하는 것입니다. 이렇게하면 10 프레임 분량의 압축되지 않은 이미지 데이터를 RAM에 묶을 수 있습니다. 파일 시스템에 바로로드하는 것이 좋지 않지만 끔찍한 일은 아닙니다. 전체 프로세스가 완료된 후에 (또는 실행 중 자유 스레드에서 자유주기를 사용해도) 작업을 수행할만한 가치가있는 경우 쉽게 다시 돌아가서 10 개의 그룹을 결합 할 수 있습니다.

모든 것이 지금까지 이어져 온 내 실제 질문입니다. MNG가 요구 사항에 가장 적합한 형식입니까? 1. 허용 라이센스로 사용할 수있는 C/C++ 구현, 2. 24/32 비트 컬러, 4 + megapixel (일부 사람들은 30 인치 모니터를 실행), 3. 무손실 또는 거의 무손실 (텍스트 선명도 유지) 압축 압축을 돕기 위해 이전 프레임을 참조하는 조항이 있습니다.

예를 들어 여기에 대한 또 다른 옵션이 있습니다. 비디오 코덱입니다. 저는 무손실 품질을 원합니다. 그러나 h.264/x264의 예가 현저하게 높은 스틸을 재생하는 것을 보았습니다. 그리고 그 성능은 훨씬 빠른 간격으로 캡처 할 수 있습니다. 나는이 두 가지를 모두 구현하고 나의 호기심을 적절히 충족시키기 위해 내 자신의 벤치마킹을 수행해야한다고 생각합니다.

답변

3

PNG 압축 구현에 액세스 할 수있는 경우 이전 이미지와의 차이로 "다음"이미지를 사전 처리하여 MNG 형식을 사용하지 않고도 쉽게 압축을 최적화 할 수 있습니다. 이것은 스크린 샷이 많이 변경되지 않는 경우 순진하지만 효과적이며 "거의 비어있는"PNG 압축은 필요한 저장 공간을 많이 줄입니다.

+0

이것은 좋은 통찰력입니다.나는 MNG 문서를 읽기 시작했고 "Delta-PNG"라고 불리는 것을 보았다. 그것은 개념적으로 (그것은 위대하다) 간단하고, 문제를 확실히 해결합니다. 아무도 비디오 스트림에 관한 흥미로운 정보를 갖고 있지 않다면이 대답을 받아 들일 것입니다. –

관련 문제