كيفية العمل مع موارد صورة PSD في Python

كيفية العمل مع موارد صورة PSD في Python

يكشف PsdImage المحمَّل كتل موارد الصورة — إدخالات على نمط البيانات الوصفية مثل الشبكات، الأدلة، وحمولات ملف تعريف ICC — من خلال عرضين للقراءة فقط، بالإضافة إلى ملخص منفصل لبطاقات الألوان المفهرسة.

دليل خطوة بخطوة

الخطوة 1: تثبيت الحزمة

git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-Python.git
cd Aspose.PSD-FOSS-for-Python
# No packaging manifest is published yet -- run from this folder,
# or add it to PYTHONPATH:
export PYTHONPATH=$PWD:$PYTHONPATH

الخطوة 2: استيراد الفئات المطلوبة

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIds

الخطوة 3: التحقق من موارد الصورة وعدّها

image = PsdImage.load("input.psd")

print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")

الخطوة 4: سرد كتل الموارد عبر image_resources

PsdImage.image_resources يُرجِع PreservedResourceBlock لكل مورد، مع معرف المورد الخام، الاسم، وحجم البايت:

for block in image.image_resources:
    print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")

التعرف على مورد معين بمقارنة block.id مع الثوابت المعروفة في ImageResourceIds:

for block in image.image_resources:
    if block.id == ImageResourceIds.ICC_PROFILE:
        print(f"Found an ICC profile resource ({block.data_size} bytes)")

محلل الموارد في هذا البناء المفتوح المصدر لا يقوم بفك تشفير معرفات الموارد إلى خصائص دلالية بنفسه — مقارنة block.id مع ImageResourceIds بنفسك هي الطريقة المدعومة للتعرف على مورد معين.


الخطوة 5: سرد ملخصات الموارد عبر resources

PsdImage.resources يُرجِع ملخص PsdResourceInfo منفصل لكل مورد، بما في ذلك تصنيف kind:

for info in image.resources:
    print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")

في هذا البناء المفتوح المصدر، kind دائمًا ما يكون PsdResourceKind.UNKNOWN — التصنيف الدلالي لأنواع الموارد المحددة (زاوية عالمية، ملف تعريف ICC) غير مُنفّذ، لذا اعتبر kind معلوماتي فقط واعتمد على resource_id (الخطوة 4) للتعرف على مورد معين.


الخطوة 6: قراءة لوحة ألوان مؤشرية

إذا كان بيانات اللون في المستند معتمدة على لوحة ألوان، PsdImage.indexed_palette تُرجع مدخلاتها:

palette = image.indexed_palette

if palette is not None:
    print(f"Palette entries: {len(palette.entries)}")

المشكلات الشائعة والحلول

image.indexed_palette is None. نوع بيانات اللون للمستند ليس INDEXED_PALETTE — المستندات ذات اللون المفهرس فقط تحمل لوحة ألوان.

Setting image.image_resources raises NotSupportedException. getter يعمل لإدراج الموارد، لكن setter غير مدعوم في هذا البناء المفتوح المصدر FOSS.

Calling block.save() على PreservedResourceBlock raises NotImplementedError. حفظ كتل الموارد الفردية مباشرة غير مدعوم — الموارد تتنقل ذهابًا وإيابًا تلقائيًا عند استدعائك image.save() على المستند بأكمله.

has_icc_profile, is_icc_profile_untagged، و global_angle لا تتغير أبداً. هذه الثلاثة PsdImage الخصائص هي قيم نائبة ثابتة في هذا الإصدار المفتوح المصدر (has_icc_profile دائمًا False, is_icc_profile_untagged دائمًا None, global_angle دائمًا 0) بغض النظر عن المحتوى الفعلي للمستند المحمَّل — لا يقوم محلل الموارد في هذا الإصدار بإعادة بناء القيم الدلالية الخاصة بالمعرف. استخدم Step 4’s block.id المقارنة ضد ImageResourceIds إذا كنت بحاجة إلى اكتشاف هذه الموارد بنفسك.

الأسئلة المتكررة

ما الفرق بين image_resources و resources؟

كلاهما يسرد نفس كتل الموارد الأساسية، ولكن كأنواع كائنات مختلفة: image_resources تُرجع كائنات PreservedResourceBlock (معرف/اسم/حجم خام، تُستخدم لإعادة التدوير)، بينما resources تُرجع ملخصات PsdResourceInfo (تضيف تصنيف kind، وهو حاليًا دائمًا UNKNOWN).

هل يمكنني تعديل أو إزالة مورد صورة؟

لا — مُعيّن image_resources يثير NotSupportedException، وPreservedResourceBlock.save() يثير NotImplementedError إذا تم استدعاؤه مباشرة. الموارد للقراءة فقط في هذه النسخة المفتوحة المصدر.

انظر أيضاً

 العربية