iPhone 개발에서 PNG 또는 JPG를 언제 사용합니까?


98

슬라이드 쇼에 여러 이미지를 표시하는 앱이 있습니다. 이러한 이미지는 번들의 일부가되어 앱과 함께 배포됩니다.

모든 이미지는 사진 또는 사진 등입니다.

이미지 형식으로 PNG를 사용하는 것이 선호된다는 것을 읽었지만 JPG 버전이 훨씬 더 작아 질 것이므로 차라리 사용하고 싶습니다.

어떤 형식을 사용해야하며 어떤 경우에 지침이 있습니까?


차이가 있다면 원본 이미지가 이미 모두 JPG 형식이라고 덧붙이고 싶었습니다.
Maverick

답변:


140

PNG는 픽셀 완벽 (비 손실)이며 표시하는 데 추가 CPU 에너지가 거의 필요하지 않습니다. 그러나 큰 PNG는 압축 된 이미지 형식보다 저장소에서 읽는 데 더 오래 걸리므로 표시 속도가 느려집니다.

JPG는 저장하기에 더 작지만 손실이 많으며 (양은 압축 수준에 따라 다름) 표시하려면 훨씬 더 복잡한 디코딩 알고리즘이 필요합니다. 그러나 일반적인 압축 및 이미지 품질은 일반적으로 사진에 충분합니다.

사진과 큰 모든 것에 JPG를 사용하고, 작거나 "픽셀 완벽"(예 : 작은 아이콘)으로 표시되도록 설계된 모든 것에 PNG를 사용하거나 합성 된 투명 오버레이 등의 일부로 사용합니다.


1
아직 JPEG vs PNG vs iPNG 디코딩 성능에 대한 데이터를 보지 못했습니다. 필요한 I / O가 줄어들 기 때문에 압축률이 더 높은 형식이 더 나은 경우도 있습니다. iPhone의 플래시 드라이브가 얼마나 빠른지 잘 모르겠습니다. 그리고 저는 PNG 압축 해제에 "아주 적은"에너지가 필요하다고는 말하지 않을 입니다. Other.artwork 파일은 일반적으로 사용되는 UI 구성 요소에 비해 PNG 압축 해제의 CPU / 메모리 오버 헤드가 너무 많기 때문에 원시 비트 맵 데이터로 보입니다.
tc.

2
현재 프로젝트에는 투명성 요구 사항 때문에 매우 큰 png 파일이 있습니다. 디스크 IO는 jpeg 디코딩에 소요되는 시간보다 훨씬 큽니다. PNG는 다른 알고리즘을 사용하여 압축됩니다.

2
이미지 성능을 최대화하려는 사람들을 위해 하나의 추가 팁을 추가 할 것이라고 생각했습니다. 잘 압축 된 JPG가있는 경우 원시 JPG 데이터를 NSData 객체에 미리로드하고 (아마도 배열 또는 사전에) 표시하고 싶을 때 UIImage : imageFromData를 사용하여 JPG를 빌드 할 수 있습니다. JPG 데이터는 비트 맵 이미지 데이터보다 10-100 배 더 작을 수 있지만 (상대적으로 느린) IO 부분을 조기에 제거 할 수 있습니다. 이러한 방식으로 캐시 / 사전로드하는 데이터의 양에 대해주의해야합니다.
Nigel Flack

2
나는 compersion 시간에 일부 데이터를 발견했습니다 cocoanetics.com/2012/09/... 것 같다을, PNG를 사용하여 빠르게 JPG보다 것을)
마치에이 Kozieł을

20

Apple은 iPhone App Bundle에 포함 된 PNG 이미지를 최적화합니다. 실제로 iPhone은 하드웨어에 맞게 색상 바이트가 최적화 된 특수 인코딩을 사용합니다. XCode는 프로젝트를 빌드 할 때이 특수 인코딩을 처리합니다. 따라서 iPhone에서 PNG를 사용하면 크기 고려 사항 외에 추가 이점이 있습니다. 이러한 이유로 인터페이스의 일부로 표시되는 이미지 (테이블보기, 레이블 등)에 PNG를 사용하는 것이 좋습니다.

사진과 같은 전체 화면 이미지를 표시하는 경우 PNG는 손실이없고 이미지를 디코딩 할 때 리소스 사용량은 말할 것도없고 시각적 품질이 JPG보다 좋기 때문에 여전히 이점을 얻을 수 있습니다. 파일 크기의 실질적인 이점을 확인하기 위해 JPG의 품질을 줄여야 할 수 있지만 최적이 아닌 이미지를 표시합니다.

파일 크기는 확실히 요소이지만 이미지 형식을 선택할 때 다른 고려 사항도 있습니다.


5
내 벤치 마크에서 Xcode 최적화는 실제로 파일을 느리게 만들었습니다. CPU가 아닌 디스크 I / O가 병목 현상이기 때문일 수 있습니다.
Kornel

1
"Apple은 iPhone 앱 번들에 포함 된 PNG 이미지를 최적화합니다."-동적으로 다운로드되는 PNG가 최적화되지 않았 음을 의미합니까?
Robert

1
아니요, 동적으로 다운로드 된 PNG는 최적화되지 않습니다. 최적화는 기본적으로 RGBA에서 BGRA로 바이트 순서를 바꾸는 것입니다. 이는 iPhone 그래픽 칩이 내부적으로 사용하는 것입니다. 여기에 더 많은 정보 : graphicsoptimization.com/blog/?p=259
닉 록우드

11

PNG에 대해 고려해야 할 중요한 사항이 하나 있습니다. PNG가 Xcode 빌드에 포함 된 경우 iOS에 최적화됩니다. 이것을 PNG 크러쉬라고합니다. 런타임에 PNG를 다운로드하면 분쇄되지 않습니다. 분쇄 된 PNG는 100 % JPG와 거의 동일하게 실행됩니다. 낮은 품질의 JPG가 높은 품질의 JPG보다 더 잘 실행됩니다. 따라서 성능 측면에서 가장 빠른 것부터 가장 느린 것까지 낮은 품질의 JPG, 고품질 JPG, PNG Crushed, PNG가됩니다.

PNG를 다운로드해야하는 경우 다운로드하기 전에 서버에서 PNG를 분쇄하는 것이 좋습니다.

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/


9

Cocoanetics 좋은 아이폰 OS의 성능 벤치 마크 게시 된 블로그 와 분쇄하지 않고, 다양한 품질 수준 및 PNG 파일에서 JPG를의를.

그의 결론에서 :

알파 채널이 절대적으로 필요하거나 PNG를 사용해야하는 경우 웹 서버에 pngcrush 도구를 설치하고 모든 PNG를 처리하도록하는 것이 좋습니다. 거의 모든 경우에 고품질 JPEG는 더 작은 파일 크기 (즉, 더 빠른 전송)와 더 빠른 압축 및 렌더링을 결합합니다.

PNG는 UI 요소에 사용할 작은 이미지에 적합하지만 카탈로그 나 잡지와 같은 전체 화면 응용 프로그램에 사용하는 것은 합리적이지 않습니다. 소스 자료에 따라 60 ~ 80 % 사이의 압축 품질을 선택하고 싶을 것입니다.

모든 것을 표시하는 측면에서 한 번 그린 UIImage 인스턴스에는 캐시 된 압축되지 않은 버전의 파일이 포함되어 있기 때문입니다. 그리고 큰 이미지가 화면에 나타나기 위해 시각적으로 멈추지 않는 곳에서는 미리 두 개의 이미지에 대해 강제로 압축을 풀어야합니다. 그러나 이러한 작업에는 많은 양의 RAM이 필요하며 지나치게 많이 사용하면 앱이 종료 될 수 있습니다. NSCache는 RAM이 부족 해지면 이미지를 자동으로 제거하므로 자주 사용하는 이미지를 배치하기에 좋은 장소입니다.

이미지에 여전히 압축 해제가 필요한지 여부를 알 수있는 방법이 없다는 것은 유감입니다. 또한 이미지가이 효과에 대해 알리지 않고 압축되지 않은 버전을 제거했을 수 있습니다. 이는 Apple의 버그보고 사이트에서 제기 할 수있는 좋은 레이더 일 수 있습니다. 그러나 다행스럽게도 이미지가 이미 압축 해제 된 경우 위와 같이 이미지에 액세스하는 데 시간이 걸리지 않습니다. 그래서 당신은 "적시에"뿐만 아니라 "경우에 따라"도 그렇게 할 수 있습니다.


정확하고 JPEGMini와 ImageOptim은 jpeg를 정말 작게 만듭니다!
electronix384128

7

약간의 감압 성능 데이터를 공유하겠다고 생각했습니다 ...

360도 뷰어의 프로토 타이핑을하고 있습니다. 사용자가 여러 각도에서 찍은 일련의 사진을 회전시켜 물체를 부드럽게 회전 할 수있는 느낌을 줄 수있는 캐 러셀입니다.

방정식에서 파일 i / o를 가져 오기 위해 이미지 데이터를 NSData 배열에로드했지만 즉시 NSImage를 만듭니다. 거의 최대 프레임 속도 (~ 25fps)에서 테스트하고 Instruments에서 시청하면 앱이 CPU에 확실히 묶여 있고 CPU 부하가 약 10 % 증가하여 ~ 275kb png와 ~ 75kb jpg를 보여줍니다.

확실히 말할 수는 없지만 CPU 제한은 일반적인 프로그램 실행과 메모리의 모든 데이터 이동에서 비롯된 것이지만 이미지 압축 해제는 GPU에서 수행됩니다. 어느 쪽이든 JPG 대 PNG 성능 인수는 특히 더 작은 파일 크기 (따라서 적어도 체인의 일부 부분에서 메모리에있는 개체의 더 작은 크기)를 고려할 때 JPG를 선호하는 것으로 보입니다.

물론 모든 상황은 다르며 테스트를 대신 할 수는 없습니다 ...


2
GPU는 PNG의 압축을 풀 수 없습니다. 사용하는 deflate 형식은 GPU가 지원하는 병렬화 유형에 적합하지 않습니다. 색 공간 변환이 관련되어 있기 때문에 JPG 디코딩이 부분적으로 GPU 가속이 될 수 있다고 생각합니다.
Kornel

5

jpeg와 png를 사용할 때 애니메이션 성능에서 큰 차이를 발견했습니다. 예를 들어 UIScrollView에 세 개의 화면 크기의 jpeg를 나란히 배치하고 iPhone4에서 가로로 스크롤하면 지연이 발생하고 완전히 불쾌한 애니메이션이 발생합니다. 같은 치수의 투명하지 않은 png를 사용하면 스크롤이 부드럽습니다. 이미지가 크더라도 jpeg를 사용하지 않습니다.


1

투명하게 사용하고 싶다면 PNG 외에는 선택의 여지가 없다고 생각합니다. 그러나 배경이 이미 불투명하다면 JPG를 사용할 수 있습니다. 그게 내가 볼 수있는 유일한 차이


3
이것은 JPG 대 PNG의 성능 고려 사항을 다루지 않습니다.
daveMac

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.