Cómo trabajar con recursos de imagen PSD en Python
Un PsdImage cargado expone sus bloques de recursos de imagen — entradas al estilo de metadatos como cuadrículas, guías y cargas útiles de perfil ICC — a través de dos vistas de solo lectura, además de un resumen separado para paletas de colores indexados.
Guía paso a paso
Paso 1: Instalar el paquete
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:$PYTHONPATHPaso 2: Importar las clases requeridas
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsPaso 3: Verificar y contar los recursos de imagen
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Paso 4: Enumerar bloques de recursos vía image_resources
PsdImage.image_resources devuelve un PreservedResourceBlock por recurso, con el ID de recurso sin procesar, el nombre y el tamaño en bytes:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Reconozca un recurso específico comparando block.id con las constantes conocidas en ImageResourceIds:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")El analizador de recursos de esta compilación FOSS no decodifica los IDs de recursos en propiedades semánticas por sí mismo — comparar block.id con ImageResourceIds usted mismo es la forma soportada de reconocer un recurso específico.
Paso 5: Enumerar resúmenes de recursos vía resources
PsdImage.resources devuelve un resumen PsdResourceInfo separado por recurso, que incluye una clasificación kind:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")En esta compilación FOSS, kind siempre es PsdResourceKind.UNKNOWN — la clasificación semántica de tipos específicos de recursos (ángulo global, perfil ICC) no está implementada, por lo que trate kind solo como informativa y confíe en resource_id (Paso 4) para reconocer un recurso específico.
Paso 6: Leer una paleta de colores indexada
Si los datos de color del documento se basan en una paleta, PsdImage.indexed_palette devuelve sus entradas:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Problemas comunes y soluciones
image.indexed_palette is None. El tipo de datos de color del documento no es INDEXED_PALETTE — solo los documentos de color indexado llevan una paleta.
Setting image.image_resources raises NotSupportedException. El getter funciona para listar recursos, pero el setter no es compatible en esta compilación FOSS.
Calling block.save() en un PreservedResourceBlock raises NotImplementedError. Guardar bloques de recursos individuales directamente no está soportado — los recursos hacen un round-trip automáticamente cuando llamas image.save() sobre el documento completo.
has_icc_profile, is_icc_profile_untagged, y global_angle nunca cambian. Estos tres PsdImage propiedades son valores de marcador de posición fijos en esta compilación FOSS (has_icc_profile siempre es False, is_icc_profile_untagged siempre es None, global_angle siempre es 0) independientemente del contenido real del documento cargado — el analizador de recursos de esta compilación no reconstruye valores semánticos específicos de ID. Use Step 4’s block.id comparación contra ImageResourceIds si necesitas detectar estos recursos tú mismo.
Preguntas frecuentes
¿Cuál es la diferencia entre image_resources y resources?
Ambos enumeran los mismos bloques de recursos subyacentes, pero como diferentes tipos de objetos: image_resources devuelve objetos PreservedResourceBlock (ID/nombre/tamaño sin procesar, usados para round-tripping), mientras que resources devuelve resúmenes PsdResourceInfo (añade una clasificación kind, actualmente siempre UNKNOWN).
¿Puedo modificar o eliminar un recurso de imagen?
No — el setter de image_resources lanza NotSupportedException, y PreservedResourceBlock.save() lanza NotImplementedError si se llama directamente. Los recursos son de solo lectura en esta compilación FOSS.