เมื่อใดควรใช้ PNG หรือ JPG ในการพัฒนา iPhone


98

ฉันมีแอพที่จะแสดงรูปภาพจำนวนมากในสไลด์โชว์ ภาพเหล่านั้นจะเป็นส่วนหนึ่งของชุดข้อมูลดังกล่าวจึงแจกจ่ายให้กับแอป

รูปภาพทั้งหมดเป็นรูปถ่ายหรือรูปถ่าย ฯลฯ

ฉันได้อ่านพบว่าควรใช้ PNG เป็นรูปแบบภาพ แต่เมื่อเห็นว่าเวอร์ชัน JPG จะมีขนาดเล็กกว่ามากฉันจึงควรใช้แบบนั้น

มีแนวทางใดบ้างที่จะใช้รูปแบบและในกรณีใด


ฉันต้องการเพิ่มว่าภาพต้นฉบับทั้งหมดอยู่ในรูปแบบ JPG อยู่แล้วหากสิ่งนั้นสร้างความแตกต่าง
Maverick

คำตอบ:


140

PNG เป็นพิกเซลที่สมบูรณ์แบบ (ไม่สูญเสีย) และต้องการพลังงาน CPU เพิ่มเล็กน้อยในการแสดงผล อย่างไรก็ตาม PNG ขนาดใหญ่อาจใช้เวลาอ่านจากที่จัดเก็บนานกว่ารูปแบบภาพที่บีบอัดมากกว่าจึงแสดงผลได้ช้ากว่า

JPG มีขนาดเล็กกว่าในการจัดเก็บ แต่ขาดทุน (จำนวนขึ้นอยู่กับระดับการบีบอัด) และในการแสดงต้องใช้อัลกอริธึมการถอดรหัสที่ซับซ้อนกว่ามาก แต่โดยทั่วไปการบีบอัดและคุณภาพของภาพมักจะเพียงพอสำหรับภาพถ่าย

ใช้ JPG สำหรับรูปภาพและสำหรับอะไรก็ได้ที่มีขนาดใหญ่และ PNG สำหรับสิ่งที่มีขนาดเล็กและ / หรือออกแบบมาเพื่อแสดง "พิกเซลที่สมบูรณ์แบบ" (เช่นไอคอนขนาดเล็ก) หรือเป็นส่วนหนึ่งของภาพซ้อนทับแบบโปร่งใสเป็นต้น


1
ฉันยังไม่เห็นข้อมูลใด ๆ เกี่ยวกับประสิทธิภาพการถอดรหัส JPEG vs PNG เทียบกับ iPNG บางครั้งรูปแบบที่บีบอัดมากขึ้นจะดีกว่าเนื่องจากต้องการ I / O ที่ลดลง ฉันไม่แน่ใจว่าแฟลชไดรฟ์ของ iPhone เร็วแค่ไหน และแน่นอนฉันจะไม่บอกว่าการบีบอัด PNG ต้องการพลังงาน "น้อยมาก" ไฟล์ Other.artwork ดูเหมือนจะเป็นข้อมูลดิบบิตแมปซึ่งน่าจะเป็นเพราะค่าใช้จ่ายของ CPU / หน่วยความจำของการคลายการบีบอัด PNG มากเกินไปสำหรับส่วนประกอบ UI ที่ใช้กันทั่วไป
tc.

2
ในโครงการปัจจุบันของฉันเรามีไฟล์ png ขนาดใหญ่มากเนื่องจากข้อกำหนดด้านความโปร่งใส IO ของดิสก์มีมากกว่าเวลาที่ใช้ในการถอดรหัส jpeg อย่างมาก โปรดทราบว่า PNG จะถูกบีบอัดด้วยเช่นกันโดยใช้อัลกอริทึมอื่น
John

2
คิดว่าฉันจะเพิ่มเคล็ดลับเสริมสำหรับผู้ที่พยายามเพิ่มประสิทธิภาพของภาพให้สูงสุด หากคุณมี JPG ที่บีบอัดได้ดีคุณสามารถโหลดข้อมูล JPG ดิบลงในออบเจ็กต์ NSData ล่วงหน้า (อาจอยู่ในอาร์เรย์หรือพจนานุกรม) และสร้าง JPG โดยใช้ UIImage: imageFromData เมื่อคุณต้องการแสดง ข้อมูล JPG อาจมีขนาดเล็กกว่าข้อมูลภาพบิตแมป 10-100 เท่า แต่ช่วยให้คุณสามารถดึงส่วน IO (ค่อนข้างช้า) ออกไปได้ก่อนเวลาอันควร แน่นอนว่าต้องระวังข้อมูลที่คุณแคช / โหลดล่วงหน้าด้วยวิธีนี้
Nigel Flack

2
ฉันพบข้อมูลบางอย่างเกี่ยวกับ compersion times: cocoanetics.com/2012/09/… ดูเหมือนว่าการใช้ png จะไม่เร็วกว่า jpg;)
Maciej Kozieł

20

Apple ปรับแต่งภาพ PNG ที่รวมอยู่ในชุดแอพ iPhone ของคุณ ในความเป็นจริง iPhone ใช้การเข้ารหัสพิเศษซึ่งไบต์สีได้รับการปรับให้เหมาะสมกับฮาร์ดแวร์ XCode จัดการการเข้ารหัสพิเศษนี้ให้คุณเมื่อคุณสร้างโครงการ ดังนั้นคุณจะเห็นประโยชน์เพิ่มเติมในการใช้ PNG บน iPhone นอกเหนือจากการพิจารณาขนาด ด้วยเหตุนี้จึงขอแนะนำให้ใช้ PNG สำหรับรูปภาพใด ๆ ที่ปรากฏเป็นส่วนหนึ่งของอินเทอร์เฟซ (ในมุมมองตารางป้ายกำกับ ฯลฯ )

สำหรับการแสดงภาพแบบเต็มหน้าจอเช่นภาพถ่ายคุณอาจยังได้รับประโยชน์จาก PNG เนื่องจากไม่สูญเสียและคุณภาพของภาพควรดีกว่า JPG ไม่ต้องพูดถึงการใช้ทรัพยากรด้วยการถอดรหัสภาพ คุณอาจต้องลดคุณภาพของ JPG ของคุณเพื่อให้ได้ประโยชน์ที่แท้จริงในขนาดไฟล์ แต่คุณกำลังแสดงภาพที่ไม่เหมาะสม

ขนาดไฟล์เป็นปัจจัยหนึ่งอย่างแน่นอน แต่ก็มีข้อควรพิจารณาอื่น ๆ เช่นกันเมื่อเลือกรูปแบบภาพ


5
ในการเพิ่มประสิทธิภาพ Xcode มาตรฐานของฉันทำให้ไฟล์ช้าลงจริง ๆ อาจเป็นเพราะดิสก์ I / O ไม่ใช่ CPU ที่เป็นคอขวด
Kornel

1
"Apple ปรับแต่งภาพ PNG ที่รวมอยู่ในชุดแอป iPhone ของคุณ" - หมายความว่า PNG ที่ดาวน์โหลดแบบไดนามิกไม่ได้รับการปรับให้เหมาะสมใช่หรือไม่
Robert

1
ไม่ PNG ที่ดาวน์โหลดแบบไดนามิกไม่ได้รับการปรับให้เหมาะสม การเพิ่มประสิทธิภาพนั้นเป็นเพียงการสลับลำดับไบต์จาก RGBA เป็น BGRA ซึ่งเป็นสิ่งที่ชิปกราฟิกของ iPhone ใช้ภายใน ข้อมูลเพิ่มเติมที่นี่: graphicsoptimization.com/blog/?p=259
Nick Lockwood

11

มีสิ่งสำคัญอย่างหนึ่งที่ต้องคิดเกี่ยวกับ PNG หากมี PNG รวมอยู่ในรุ่น Xcode ของคุณมันจะได้รับการปรับให้เหมาะสมสำหรับ iOS สิ่งนี้เรียกว่า PNG ปิ๊ก หากไฟล์ PNG ของคุณถูกดาวน์โหลดในเวลาทำงานมันจะไม่ถูกบดขยี้ PNG ที่บดแล้วจะทำงานเหมือนกับ JPG 100% JPG คุณภาพต่ำจะทำงานได้ดีกว่า JPG คุณภาพสูงกว่า ดังนั้นจากมุมมองด้านประสิทธิภาพจากเร็วที่สุดไปยังช้าที่สุดจะใช้ JPG คุณภาพต่ำ, JPG คุณภาพสูง, PNG บด, PNG

หากคุณต้องการดาวน์โหลด PNG คุณควรพิจารณาบด PNG บนเซิร์ฟเวอร์ก่อนดาวน์โหลด

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


9

Cocoanetics บล็อกที่เผยแพร่ดี iOS ของการวัดประสิทธิภาพ ของ JPGs ในระดับคุณภาพที่หลากหลายและ PNGs ที่มีและไม่มีการบด

จากข้อสรุปของเขา:

หากคุณต้องการช่องอัลฟ่าหรือต้องใช้ PNGs ขอแนะนำให้ติดตั้งเครื่องมือ pngcrush บนเว็บเซิร์ฟเวอร์ของคุณและให้มันประมวลผล PNG ทั้งหมดของคุณ ในกรณีอื่น ๆ เกือบทั้งหมด JPEG คุณภาพสูงจะรวมขนาดไฟล์ที่เล็กลง (เช่นการส่งที่เร็วขึ้น) ด้วยการบีบอัดและการเรนเดอร์ที่เร็วขึ้น

ปรากฎว่า PNG เหมาะสำหรับภาพขนาดเล็กที่คุณจะใช้เป็นองค์ประกอบ UI แต่ไม่สมเหตุสมผลที่จะใช้กับแอปพลิเคชันแบบเต็มหน้าจอเช่นแคตตาล็อกหรือนิตยสาร คุณต้องการเลือกคุณภาพการบีบอัดระหว่าง 60 ถึง 80% ขึ้นอยู่กับแหล่งข้อมูลของคุณ

ในแง่ของการทำให้ทุกอย่างแสดงขึ้นคุณจะต้องแขวนอินสแตนซ์ UIImage จากที่คุณวาดครั้งเดียวเนื่องจากมีไฟล์เวอร์ชันที่ไม่มีการบีบอัดแคชอยู่ในนั้น และในกรณีที่คุณไม่ต้องหยุดภาพชั่วคราวเพื่อให้ภาพขนาดใหญ่ปรากฏบนหน้าจอคุณจะต้องบังคับให้คลายการบีบอัดภาพล่วงหน้าสองสามภาพ แต่จำไว้ว่าสิ่งเหล่านี้จะใช้ RAM เป็นจำนวนมากและหากคุณใช้งานมากเกินไปอาจทำให้แอปของคุณถูกยุติการใช้งาน NSCache เป็นสถานที่ที่ยอดเยี่ยมในการวางภาพที่ใช้บ่อยเนื่องจากจะดูแลการขับไล่ภาพโดยอัตโนมัติเมื่อ RAM หายาก

เป็นเรื่องโชคร้ายที่เราไม่มีทางรู้ได้เลยว่าภาพยังคงต้องการการคลายการบีบอัดหรือไม่ นอกจากนี้รูปภาพอาจขับไล่เวอร์ชันที่ไม่มีการบีบอัดโดยไม่แจ้งให้เราทราบถึงผลกระทบนี้ นั่นอาจเป็นเรดาร์ที่ดีในการเพิ่มเว็บไซต์รายงานข้อบกพร่องของ Apple แต่โชคดีที่การเข้าถึงภาพตามที่แสดงด้านบนนั้นใช้เวลาไม่นานหากภาพถูกคลายการบีบอัดแล้ว ดังนั้นคุณสามารถทำได้ไม่เพียง แต่“ ทันเวลา” แต่ยัง“ ในกรณี” ด้วย


แน่นอนและ JPEGMini และ ImageOptim ทำให้ jpegs มีขนาดเล็กมาก!
electronix384128

7

แค่คิดว่าฉันจะแบ่งปันข้อมูลประสิทธิภาพการบีบอัดเล็กน้อย ...

ฉันกำลังสร้างต้นแบบของมุมมอง 360 องศาซึ่งเป็นภาพหมุนที่ผู้ใช้สามารถหมุนผ่านชุดรูปภาพที่ถ่ายจากมุมต่างๆเพื่อให้รู้สึกว่าสามารถหมุนวัตถุได้อย่างราบรื่น

ฉันโหลดข้อมูลรูปภาพลงในอาร์เรย์ของ NSData เพื่อนำไฟล์ i / o ออกจากสมการ แต่สร้าง NSImage ได้ทันที การทดสอบที่อัตราเฟรมใกล้เคียงสูงสุด (~ 25 fps) และการดูในเครื่องมือฉันเห็นว่าแอปนั้นเชื่อมต่อกับ CPU อย่างชัดเจนและมีการโหลด CPU เพิ่มขึ้นประมาณ 10% โดยแสดง ~ 275 kb png เทียบกับ ~ 75 kb jpg

ฉันไม่สามารถพูดได้อย่างแน่นอน แต่การคาดเดาของฉันคือขีด จำกัด ของ CPU นั้นมาจากการเรียกใช้โปรแกรมทั่วไปและการย้ายข้อมูลทั้งหมดในหน่วยความจำ แต่การคลายการบีบอัดภาพนั้นทำบน GPU ไม่ว่าจะด้วยวิธีใดก็ตามและอาร์กิวเมนต์ประสิทธิภาพ JPG เทียบกับ PNG ดูเหมือนจะเป็นประโยชน์ต่อ JPG โดยเฉพาะอย่างยิ่งเมื่อมีขนาดไฟล์ที่เล็กกว่า (และมีขนาดเล็กกว่าของวัตถุในหน่วยความจำอย่างน้อยก็ในบางส่วนของห่วงโซ่)

แน่นอนว่าทุกสถานการณ์แตกต่างกันไม่มีการทดสอบทดแทน ...


2
GPU ไม่สามารถขยายขนาด PNG ได้ รูปแบบการยุบตัวที่ใช้ไม่เหมาะสำหรับ GPU แบบขนานที่เปิดใช้งาน ฉันเดาว่าการถอดรหัส JPG สามารถเร่ง GPU ได้บางส่วนเนื่องจากมีการแปลงสีที่เกี่ยวข้อง
Kornel

5

ฉันพบความแตกต่างอย่างมากในประสิทธิภาพการเคลื่อนไหวเมื่อใช้ jpegs กับ png ตัวอย่างเช่นการวาง jpegs ขนาดหน้าจอสามตัวไว้ข้างกันใน UIScrollView และการเลื่อนในแนวนอนบน iPhone4 จะส่งผลให้เกิดความล่าช้าและภาพเคลื่อนไหวที่กระตุกอย่างไม่เป็นที่พอใจ ด้วย png ที่ไม่โปร่งใสในขนาดเดียวกันการเลื่อนจะราบรื่น ฉันไม่เคยใช้ jpegs แม้ว่าภาพจะมีขนาดใหญ่ก็ตาม


1

ฉันคิดว่าถ้าคุณต้องการใช้แบบโปร่งใสคุณไม่มีทางเลือกอื่นนอกจาก PNG แต่ถ้าพื้นหลังของคุณทึบแสงอยู่แล้วคุณอาจใช้ JPG นั่นคือความแตกต่างเดียวที่ฉันเห็น


3
สิ่งนี้ไม่ได้กล่าวถึงการพิจารณาประสิทธิภาพของ JPG เทียบกับ PNG
daveMac

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.