วิธีทำงานกับทรัพยากรภาพ 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 ต่อทรัพยากรหนึ่งรายการ พร้อมด้วย ID ของทรัพยากรดิบ, ชื่อ, และขนาดเป็นไบต์:
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)")ตัวแยกวิเคราะห์ทรัพยากรของการสร้าง FOSS นี้ไม่ได้ถอดรหัส ID ของทรัพยากรเป็นคุณสมบัติเชิงความหมาย — การเปรียบเทียบ 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) โดยไม่คำนึงถึงเนื้อหาจริงของเอกสารที่โหลด — ตัวแยกวิเคราะห์ทรัพยากรของรุ่นนี้ไม่ทำการสร้างค่าความหมายเฉพาะ ID ใหม่ ใช้ Step 4’s block.id การเปรียบเทียบกับ ImageResourceIds หากคุณต้องการตรวจจับทรัพยากรเหล่านี้ด้วยตนเอง.
คำถามที่พบบ่อย
ความแตกต่างระหว่าง image_resources และ resources คืออะไร?
ทั้งสองรายการบล็อกทรัพยากรพื้นฐานเดียวกัน แต่เป็นประเภทวัตถุที่แตกต่างกัน: image_resources คืนค่าอ็อบเจ็กต์ PreservedResourceBlock (raw ID/name/size, ใช้สำหรับ round-tripping), ในขณะที่ resources คืนค่าสรุป PsdResourceInfo (เพิ่มการจัดประเภท kind, ปัจจุบันจะเป็น UNKNOWN เสมอ).
ฉันสามารถแก้ไขหรือลบทรัพยากรภาพได้หรือไม่?
ไม่ — ตัวตั้งค่า image_resources จะโยน NotSupportedException, และ PreservedResourceBlock.save() จะโยน NotImplementedError หากถูกเรียกโดยตรง. ทรัพยากรเป็นแบบอ่านอย่างเดียวในรุ่น FOSS นี้.