سؤال

أقوم بالتقاط صورة من ألبوم الكاميرا ثم أستخدمها لفترة من الوقت بالإضافة إلى حفظها على القرص بتنسيق PNG على iPhone.أتلقى عطلًا غريبًا، ربما بسبب نفاد الذاكرة.

هل يحدث فرقًا إذا قمت بحفظه بتنسيق PNG أو JPG (بافتراض أنني اخترت ملاحظة لتقليل الجودة في حالة JPG)؟خاصة:

  • هل تستخدم UIImage مساحة أكبر من الذاكرة بعد إعادة تحميلها من القرص إذا قمت بحفظها بتنسيق PNG؟
  • هل من الممكن إجراء عملية الحفظ لأن PNG تستهلك المزيد من الذاكرة بشكل عابر أثناء عملية الحفظ؟

كنت أفترض أن UIImage عبارة عن تمثيل محايد للتنسيق ولا ينبغي أن يهم، لكنني اعتقدت أنه يجب علي التحقق.

هل كانت مفيدة؟

المحلول

لدي تطبيق في المتجر يحتاج إلى حفظ الإصدارات المتوسطة من الصورة أثناء تحريرها.في الإصدار الأصلي، استخدمت تنسيق PNG للحفظ لتجنب فقدان الجودة من تحميل وحفظ JPEG عدة مرات.

في وقت ما حول إصدار البرنامج 2.2، قدمت Apple تغييرًا في كود كتابة PNG، بحيث يستغرق حفظ بيانات PNG من بعض الصور وقتًا أطول عدة مرات.انتهى بي الأمر إلى التغيير إلى الحفظ بتنسيق JPEG، لأن مهلة تطبيقي انتهت عند محاولة حفظ الصور عند الخروج.

ستواجه أيضًا مشكلات لأن الحفظ بتنسيق PNG لا يحافظ على معلومات "الاتجاه" في UIImage، لذلك ستظهر الصورة الملتقطة بالاتجاه الرأسي باستخدام الكاميرا المدمجة مدوّرة بعد حفظها وإعادة تحميلها.

نصائح أخرى


أتلقى عطلًا غريبًا، ربما بسبب نفاد الذاكرة


ثم توقف عما تفعله الآن واكتشف أولاً ما إذا كان هذا هو سبب الانهيار بالفعل.بخلاف ذلك، هناك احتمال كبير جدًا أنك تبحث عن المشكلة الخاطئة هنا، حيث تقوم بإصلاح مشكلة في الذاكرة غير موجودة مع تجاهل السبب الحقيقي للعطل.إذا كنت تريد إصلاح العطل، ابدأ بمعرفة سبب الانهيار.إن متابعة المشكلة "المفترضة" هي وصفة لإضاعة الوقت والجهد.

يعتمد ذلك على نوع الصور التي تتعامل معها.إذا كنت تتعامل مع صور فوتوغرافية، فستكون ملفات JPEG دائمًا أصغر من ملفات PNG، دون فقدان ملحوظ للتفاصيل كما يمكن رؤيتها بالعين البشرية.

على العكس من ذلك، إذا كنت تتعامل مع صور غير فوتوغرافية إلى حد كبير مثل عناصر واجهة المستخدم الرسومية أو الصور التي تحتوي على كتل كبيرة من الألوان الصلبة، فستكون ملفات PNG وJPEG قابلة للمقارنة في الحجم، ولكن سيتم حفظ PNG دون فقدان البيانات بينما سيتم فقدان ملفات JPEG وستحتوي على التحف واضحة جدا.اذا كان لديك حقًا صورة بسيطة (كتل كبيرة جدًا من الألوان الثابتة، على سبيل المثال)، فمن المرجح جدًا أن يكون ملف PNG أصغر بكثير من ملف JPEG، ومرة ​​أخرى لن يحتوي على أي عناصر ضغط.

لا ينبغي أن تستهلك عملية حفظ الصورة بتنسيق PNG أو JPEG قدرًا كبيرًا من الذاكرة المؤقتة.عندما تكون الصورة في الذاكرة، يتم عادةً تخزينها غير مضغوطة في الذاكرة بحيث يمكن سحبها إلى الشاشة بسرعة كبيرة، بدلاً من الاضطرار إلى فك ضغطها في كل مرة تريد عرضها.بالمقارنة بحجم الصورة غير المضغوطة، فإن مقدار مساحة التخزين المؤقتة الإضافية التي تحتاجها لضغطها صغير جدًا.إذا كان بإمكانك احتواء الصورة غير المضغوطة في الذاكرة، فلا داعي للقلق بشأن الذاكرة المستخدمة أثناء ضغطها.

وبالطبع، بمجرد كتابة الصورة إلى نظام الملفات في وحدة تخزين غير متطايرة وتحرير الصورة الموجودة في الذاكرة، لا يهم حقًا حجم الصورة المضغوطة، لأنها لم تعد تشغل الذاكرة الرئيسية بعد الآن .يؤثر حجم الصورة المضغوطة فقط على مقدار وحدة تخزين الفلاش التي تستخدمها، وهو ما يمكن أن يمثل مشكلة، ولكنه لا يؤثر على احتمال نفاد ذاكرة تطبيقك.

قد تكون أعطالك ناتجة عن تسرب معروف للذاكرة في UIImagePickerController.

هذا يجب أن يساعدك على إصلاح ذلك.

ليس لدي أي بيانات ثابتة، لكنني أفترض أن ملفات PNG هي الأفضل لأنه يبدو أن Apple تستخدم ملفات PNG تقريبًا في كل مكان في نظام تشغيل iPhone.

ومع ذلك، إذا كنت قد قمت بالفعل بإعداد التعليمات البرمجية لكتابة ملفات PNG، فلن يكون من الصعب جدًا تغييرها لكتابة ملفات JPEG، أليس كذلك؟ما عليك سوى تجربة كلتا الطريقتين ومعرفة أيهما يعمل بشكل أفضل.

استخدم PNG حيثما أمكن ذلك.كجزء من التجميع، يقوم XCode بتشغيل جميع ملفات PNG من خلال أداة مساعدة (pngcrush) لضغطها وتحسينها.

  1. هل يتم استخدام المزيد من الذاكرة من قبل uiimage بعد إعادة تحميلها من القرص إذا قمت بحفظها كـ PNG؟=> لا، إنه نفس حجم الذاكرة إذا قمت بالاستيراد من صورتين لهما نفس الدقة ونفس عدد القنوات.(مثل RGBA)
  2. هل من الممكن إجراء عملية الحفظ لأن PNG تستهلك المزيد من الذاكرة بشكل عابر أثناء عملية الحفظ؟=> لا، فهو يؤثر فقط على ذاكرة القرص لديك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top