You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ag-psd解析PSD并区分图片、文本、矩形等精确图层类型?

解决方案:基于ag-psd的PSD图层精细区分与属性提取

一、核心图层类型区分逻辑

ag-psd返回的图层对象包含type字段及各类专属属性,可通过这些特征精准区分目标图层:

1. 文本图层判断

文本图层的type为text,同时包含text属性存储内容,直接判断即可:

function isTextLayer(layer) {
  return layer.type === 'text';
}

2. 形状图层(矩形/圆角矩形)判断

矩形、圆角矩形都属于形状图层,type为shape,需通过shapes数组内的type进一步区分:

  • 普通矩形:shape.type === 'rectangle'
  • 圆角矩形:shape.type === 'rectangle'且包含cornerRadii属性
function isRectangleLayer(layer) {
  if (layer.type !== 'shape') return false;
  return layer.shapes.some(shape => shape.type === 'rectangle');
}

function isRoundedRectangleLayer(layer) {
  if (layer.type !== 'shape') return false;
  return layer.shapes.some(shape => 
    shape.type === 'rectangle' && shape.cornerRadii !== undefined
  );
}

3. 图片图层判断

像素类图层(普通图片、智能对象)的type为pixel,若为智能对象还会有smartObject属性:

function isImageLayer(layer) {
  return layer.type === 'pixel' || (layer.type === 'smartObject' && layer.smartObject);
}

二、图层位置与尺寸提取

所有图层的位置、尺寸信息统一存储在bounds属性中,结构为[x, y, width, height],直接解构即可:

function getLayerBounds(layer) {
  const [x, y, width, height] = layer.bounds;
  return { x, y, width, height };
}

三、不支持图层的图片转换处理

对于无法识别的图层类型,可利用ag-psd的layer.toPng()方法(需搭配node-canvas或浏览器Canvas环境)将图层转为图片:

async function convertLayerToImage(layer) {
  if (isTextLayer(layer) || isRectangleLayer(layer) || isImageLayer(layer)) {
    return null; // 跳过已支持的图层
  }
  // 转为PNG数据URL或Buffer
  const pngData = await layer.toPng();
  return {
    type: 'converted-image',
    bounds: getLayerBounds(layer),
    imageData: pngData
  };
}

四、完整解析流程示例

const { readPsd } = require('ag-psd');
const fs = require('fs');

async function parsePsdToCustomJson(filePath) {
  const psd = await readPsd(fs.readFileSync(filePath), { loadImages: true });
  const customLayers = [];

  for (const layer of psd.children) {
    const layerInfo = {
      bounds: getLayerBounds(layer)
    };

    if (isTextLayer(layer)) {
      layerInfo.type = 'text';
      layerInfo.content = layer.text;
    } else if (isRoundedRectangleLayer(layer)) {
      layerInfo.type = 'rounded-rectangle';
      layerInfo.cornerRadii = layer.shapes.find(s => s.type === 'rectangle').cornerRadii;
    } else if (isRectangleLayer(layer)) {
      layerInfo.type = 'rectangle';
    } else if (isImageLayer(layer)) {
      layerInfo.type = 'image';
      layerInfo.imageData = await layer.toPng();
    } else {
      // 转换为图片
      const converted = await convertLayerToImage(layer);
      if (converted) customLayers.push(converted);
      continue;
    }

    customLayers.push(layerInfo);
  }

  return JSON.stringify({ layers: customLayers }, null, 2);
}

内容的提问来源于stack exchange,提问作者machve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:54:57