איך לעבוד עם משאבי תמונת 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)")ה-parser של המשאבים בבנייה זו של FOSS אינו מפענח מזהי משאבים לתכונות סמנטיות בעצמו — השוואת 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}")בבנייה זו של FOSS, 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 המאפיינים הם ערכי מציין מקום קבועים בבנייה הזו של FOSS (has_icc_profile תמיד False, is_icc_profile_untagged תמיד None, global_angle תמיד 0) ללא קשר לתוכן האמיתי של המסמך הטעון — המפענח המשאבים של בנייה זו אינו משחזר ערכי סמנטיקה ספציפיים למזהה. השתמש ב-שלב4 block.id השוואה ל ImageResourceIds אם אתה צריך לאתר את המשאבים האלה בעצמך.
שאלות נפוצות
מה ההבדל בין image_resources ל-resources?
שניהם מציגים את אותם בלוקי משאבים בסיסיים, אך כסוגי אובייקטים שונים: image_resources מחזיר אובייקטים של PreservedResourceBlock (מזהה/שם/גודל גולמי, משמש ל-round-tripping), בעוד resources מחזיר תקצירי PsdResourceInfo (מוסיף סיווג kind, שכיום תמיד UNKNOWN).
האם אני יכול לשנות או להסיר משאב תמונה?
לא — המגדיר של image_resources מעלה NotSupportedException, ו-PreservedResourceBlock.save() מעלה NotImplementedError אם קוראים לו ישירות. המשאבים הם לקריאה בלבד בגרסה הזו של FOSS.