Khi nào sử dụng PNG hoặc JPG trong phát triển iPhone?


98

Tôi có một ứng dụng sẽ hiển thị nhiều hình ảnh trong trình chiếu. Những hình ảnh đó sẽ là một phần của gói, do đó được phân phối với ứng dụng.

Tất cả các hình ảnh là ảnh chụp hoặc ảnh chụp, v.v.

Tôi đã đọc rằng nên sử dụng PNG làm định dạng hình ảnh, nhưng thấy rằng phiên bản JPG sẽ nhỏ hơn nhiều, tôi muốn sử dụng nó hơn.

Có bất kỳ hướng dẫn nào để sử dụng định dạng và trong trường hợp nào không?


Tôi muốn nói thêm rằng tất cả các hình ảnh gốc đều ở định dạng JPG nếu điều đó tạo ra bất kỳ sự khác biệt nào.
Maverick

Câu trả lời:


140

PNG là pixel hoàn hảo (không bị mất) và cần thêm rất ít năng lượng CPU để hiển thị. Tuy nhiên, các tệp PNG lớn có thể mất nhiều thời gian hơn để đọc từ bộ nhớ so với nhiều định dạng ảnh nén hơn và do đó hiển thị chậm hơn.

Các JPG nhỏ hơn để lưu trữ, nhưng mất mát (số lượng phụ thuộc vào mức độ nén) và để hiển thị chúng đòi hỏi một thuật toán giải mã phức tạp hơn nhiều. Nhưng chất lượng hình ảnh và nén thông thường thường khá đủ cho ảnh chụp.

Sử dụng JPG cho ảnh và cho bất kỳ thứ gì lớn và PNG cho bất kỳ thứ gì nhỏ và / hoặc được thiết kế để hiển thị "pixel hoàn hảo" (ví dụ: các biểu tượng nhỏ) hoặc như một phần của lớp phủ trong suốt tổng hợp, v.v.


1
Tôi vẫn chưa thấy bất kỳ dữ liệu nào về hiệu suất giải mã JPEG so với PNG và iPNG. Đôi khi định dạng nén nhiều hơn sẽ tốt hơn do yêu cầu I / O giảm; Tôi không chắc tốc độ ổ đĩa flash của iPhone. Và tôi chắc chắn sẽ không nói rằng giải nén PNG yêu cầu năng lượng "rất ít"; tệp Other.artwork dường như là dữ liệu bitmap thô, có thể là do chi phí CPU / bộ nhớ khi giải nén PNG quá nhiều đối với các thành phần giao diện người dùng thường được sử dụng.
tc.

2
Trong dự án hiện tại của tôi, chúng tôi có các tệp png rất lớn vì yêu cầu về tính minh bạch. IO của đĩa lớn hơn rất nhiều so với thời gian dành cho việc giải mã một jpeg. Xin lưu ý rằng PNG cũng được nén, chỉ sử dụng một thuật toán khác.
John

2
Tôi sẽ thêm một mẹo bổ sung cho những người đang cố gắng tối đa hóa hiệu suất hình ảnh. NẾU bạn đã nén tốt JPG, bạn có thể tải trước dữ liệu JPG thô vào các đối tượng NSData (có thể trong một mảng hoặc từ điển) và xây dựng các JPG bằng UIImage: imageFromData khi bạn muốn hiển thị. Dữ liệu JPG có thể nhỏ hơn 10-100 lần so với dữ liệu hình ảnh bitmap, nhưng nó cho phép bạn xử lý sớm phần IO (tương đối chậm). Rõ ràng là hãy cẩn thận về lượng dữ liệu bạn lưu vào bộ nhớ cache / tải trước theo cách này.
Nigel Flack

2
Tôi đã tìm thấy một số dữ liệu về thời gian biên dịch: cocoanetics.com/2012/09/… Có vẻ như sử dụng png không nhanh hơn jpg;)
Maciej Kozieł

20

Apple tối ưu hóa các hình ảnh PNG có trong gói ứng dụng iPhone của bạn. Trên thực tế, iPhone sử dụng một bảng mã đặc biệt, trong đó các byte màu được tối ưu hóa cho phần cứng. XCode xử lý mã hóa đặc biệt này cho bạn khi bạn xây dựng dự án của mình. Vì vậy, bạn sẽ thấy những lợi ích bổ sung khi sử dụng PNG trên iPhone ngoài việc xem xét kích thước của chúng. Vì lý do này, bạn nên sử dụng PNG cho bất kỳ hình ảnh nào xuất hiện như một phần của giao diện (trong chế độ xem bảng, nhãn, v.v.).

Đối với việc hiển thị hình ảnh toàn màn hình chẳng hạn như một bức ảnh, bạn vẫn có thể thu được lợi ích với PNG vì chúng không bị mất và chất lượng hình ảnh sẽ tốt hơn JPG chưa kể đến việc sử dụng tài nguyên khi giải mã hình ảnh. Bạn có thể cần giảm chất lượng của JPG để thấy được lợi ích thực sự về kích thước tệp nhưng khi đó bạn đang hiển thị hình ảnh không tối ưu.

Kích thước tệp chắc chắn là một yếu tố nhưng cũng có những cân nhắc khác khi chọn định dạng hình ảnh.


5
Trong tối ưu hóa Xcode điểm chuẩn của tôi thực sự làm cho các tệp chậm hơn, có thể là do I / O đĩa chứ không phải CPU là nút cổ chai.
Kornel

1
"Apple tối ưu hóa hình ảnh PNG có trong gói ứng dụng iPhone của bạn" - Điều này có nghĩa là PNG được tải xuống động không được tối ưu hóa?
Robert

1
Không, các tệp PNG được tải xuống động không được tối ưu hóa. Việc tối ưu hóa về cơ bản chỉ là hoán đổi thứ tự byte từ RGBA sang BGRA, đó là những gì chip đồ họa iPhone sử dụng bên trong. Thông tin thêm tại đây: graphicsoptimization.com/blog/?p=259
Nick Lockwood

11

Có một điều quan trọng cần suy nghĩ về PNG. Nếu PNG được bao gồm trong bản dựng Xcode của bạn, nó sẽ được tối ưu hóa cho iOS. Đây được gọi là lòng PNG. Nếu PNG của bạn được tải xuống lúc chạy, nó sẽ không bị nghiền nát. PNG được nghiền nát chạy giống như 100% JPG. JPG chất lượng thấp hơn chạy tốt hơn JPG chất lượng cao hơn. Vì vậy, từ quan điểm hiệu suất từ ​​nhanh nhất đến chậm nhất, nó sẽ chuyển sang JPG chất lượng thấp, JPG chất lượng cao, PNG bị nghiền nát, PNG.

Nếu bạn cần tải xuống PNG, bạn nên cân nhắc cắt các PNG trên máy chủ trước khi tải xuống.

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


9

Các Cocoanetics Blog công bố một chuẩn mực hoạt động thoải mái iOS của JPG ở mức chất lượng khác nhau, và PNG, có và không nghiền.

Từ kết luận của anh ấy:

Nếu bạn thực sự cần một kênh alpha hoặc phải sử dụng PNG thì bạn nên cài đặt công cụ pngcrush trên máy chủ web của mình và để nó xử lý tất cả các PNG của bạn. Trong hầu hết các trường hợp khác, ảnh JPEG chất lượng cao kết hợp kích thước tệp nhỏ hơn (tức là truyền nhanh hơn) với khả năng nén và hiển thị nhanh hơn.

Hóa ra PNG rất tốt cho các hình ảnh nhỏ mà bạn sẽ sử dụng cho các phần tử giao diện người dùng, nhưng chúng không hợp lý để sử dụng cho bất kỳ ứng dụng toàn màn hình nào như danh mục hoặc tạp chí. Ở đó, bạn sẽ muốn chọn chất lượng nén từ 60 đến 80% tùy thuộc vào tài liệu nguồn của bạn.

Về việc hiển thị tất cả, bạn sẽ muốn bám vào các phiên bản UIImage mà bạn đã vẽ một lần vì chúng có phiên bản không nén được lưu trong bộ nhớ cache của tệp trong đó. Và khi bạn không tạm dừng hình ảnh để hình ảnh lớn xuất hiện trên màn hình, bạn sẽ phải giải nén trước một vài hình ảnh. Nhưng hãy nhớ rằng những điều này sẽ chiếm một lượng lớn RAM và nếu bạn lạm dụng nó có thể khiến ứng dụng của bạn bị chấm dứt. NSCache là một nơi tuyệt vời để đặt các hình ảnh được sử dụng thường xuyên vì điều này tự động xử lý việc loại bỏ các hình ảnh khi RAM trở nên khan hiếm.

Thật không may là chúng ta không có bất kỳ cách nào để biết liệu một hình ảnh có cần giải nén hay không. Ngoài ra, một hình ảnh có thể đã loại bỏ phiên bản không nén mà không thông báo cho chúng tôi về hiệu ứng này. Đó có thể là một Radar tốt để nâng cao tại trang báo cáo lỗi của Apple. Nhưng may mắn thay, việc truy cập hình ảnh như hình trên không mất nhiều thời gian nếu hình ảnh đã được giải nén. Vì vậy, bạn có thể làm điều đó không chỉ “đúng lúc” mà còn “đề phòng”.


Chính xác, JPEGMini và ImageOptim làm cho jpegs thực sự nhỏ!
electronix384128

7

Tôi chỉ nghĩ rằng tôi sẽ chia sẻ một chút dữ liệu hiệu suất giải nén ...

Tôi đang thực hiện một số tạo mẫu của một trình xem 360 độ - một băng chuyền nơi người dùng có thể quay qua một loạt ảnh được chụp từ các góc khác nhau, để tạo ấn tượng về việc có thể xoay một đối tượng một cách trơn tru.

Tôi đã tải dữ liệu hình ảnh vào một mảng của NSData để đưa tệp i / o ra khỏi phương trình, nhưng tạo NSImage một cách nhanh chóng. Thử nghiệm ở tốc độ khung hình gần tối đa (~ 25 khung hình / giây) và xem trong Instruments, tôi thấy ứng dụng rõ ràng là bị ràng buộc bởi CPU và có mức tăng khoảng 10% khi tải CPU hiển thị ~ 275 kb png so với ~ 75 kb jpg.

Tôi không thể nói chắc chắn nhưng suy đoán của tôi là giới hạn CPU chỉ là từ việc thực thi chương trình chung và di chuyển tất cả dữ liệu xung quanh trong bộ nhớ, nhưng việc giải nén hình ảnh đó được thực hiện trên GPU. Dù bằng cách nào và đối số hiệu suất JPG so với PNG có vẻ ủng hộ JPG, đặc biệt là khi kích thước tệp nhỏ hơn (và do đó kích thước nhỏ hơn của các đối tượng trong bộ nhớ ít nhất ở một số phần của chuỗi) được xem xét.

Tất nhiên mọi tình huống đều khác nhau, không thể thay thế cho việc kiểm tra ...


2
GPU không thể giải nén PNG. Định dạng giảm phát mà nó sử dụng không phù hợp với loại GPU bật song song. Tôi đoán rằng giải mã JPG có thể được tăng tốc một phần GPU, vì có liên quan đến chuyển đổi không gian màu.
Kornel

5

Tôi đã tìm thấy sự khác biệt lớn về hiệu suất hoạt ảnh khi sử dụng jpegs và png. Ví dụ: đặt ba jpegs có kích thước màn hình cạnh nhau trong UIScrollView và cuộn theo chiều ngang trên iPhone4 dẫn đến độ trễ và hình ảnh động giật hoàn toàn khó chịu. Với những chiếc kẹp không trong suốt có cùng kích thước, việc cuộn sẽ mượt mà. Tôi không bao giờ sử dụng jpegs, ngay cả khi hình ảnh lớn.


1

Tôi nghĩ nếu bạn muốn sử dụng trong suốt, bạn không có lựa chọn nào khác ngoại trừ PNG. Tuy nhiên, nếu nền của bạn đã mờ, thì bạn có thể sử dụng JPG. Đó là sự khác biệt duy nhất tôi có thể thấy


3
Điều này không giải quyết bất kỳ cân nhắc về hiệu suất của JPG và PNG.
daveMac

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.