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

Aspose.PSD合并图层或DrawImage报错:源数组长度不足如何解决?

Aspose.PSD绘制图像到图层时出现「源数组长度不足」错误的解决方案

问题重现

尝试用Aspose.PSD在指定图层绘制图像,两种方法均触发「源数组长度不足」错误:

  1. 方法一:新建图层合并到目标图层
    执行layer.MergeLayerTo(customLayer)时报错;跳过合并直接将PSD保存为PNG,同样抛出异常。

    var customLayer = rawLayers.FirstOrDefault(r => r.Name == "customlayer");
    var imageBytes =  await _fileService.GetFile(baseFile.Id);
    var overlayPsdFile = await _fileService.GetFile(file.Id);
    
    await using var psdStream = new MemoryStream(overlayPsdFile);
    using var psdImage = (PsdImage)Image.Load(psdStream);
    {
      await using var rootImageStream = new MemoryStream(imageBytes);
      var layer = new Layer(rootImageStream);
      psdImage.AddLayer(layer);
      layer.MergeLayerTo(customLayer); // 报错位置
      
      // 不合并时保存也报错
      await using var imageOutStream = new MemoryStream();
      psdImage.Save(imageOutStream, new PngOptions());
    }
    
  2. 方法二:直接调用DrawImage绘制到目标图层
    执行customLayer.DrawImage(new Point(0,0), img)时触发相同错误。

    var customLayer = rawLayers.FirstOrDefault(r => r.Name == "customlayer");
    var imageBytes =  await _fileService.GetFile(baseFile.Id);
    var overlayPsdFile = await _fileService.GetFile(file.Id);
    
    using (var ms = new MemoryStream(imageBytes))
    {
      using (var img = (RasterImage)Image.Load(ms))
      {
        customLayer.DrawImage(new Point(0,0), img); // 报错位置
      }
    }
    

可能原因

  • 待绘制图像与目标图层的像素格式(位深度、通道数)不匹配,导致数组长度不兼容
  • 待绘制图像尺寸超过目标图层画布范围,或图像加载时尺寸解析异常
  • customLayer未关联到当前加载的PsdImage实例,图层状态异常

解决方案

1. 统一像素格式

绘制/合并前将待绘制图像转换为与目标图层一致的像素格式:

var psdImage = (PsdImage)Image.Load(psdStream);
var customLayer = psdImage.Layers.FirstOrDefault(l => l.Name == "customlayer");
var imageBytes = await _fileService.GetFile(baseFile.Id);

using (var ms = new MemoryStream(imageBytes))
using (var img = (RasterImage)Image.Load(ms))
{
    // 转换像素格式匹配目标图层
    if (img.PixelFormat != customLayer.PixelFormat)
    {
        img.ChangePixelFormat(customLayer.PixelFormat);
    }
    
    customLayer.DrawImage(new Point(0, 0), img);
}

// 保存修改后的PSD
await using var outStream = new MemoryStream();
psdImage.Save(outStream, new PsdOptions());

2. 验证图层关联与尺寸兼容性

  • 确保customLayer从当前加载的PsdImage中获取,而非其他实例的图层:
    var psdImage = (PsdImage)Image.Load(psdStream);
    var customLayer = psdImage.Layers.FirstOrDefault(l => l.Name == "customlayer");
    
  • 若图像尺寸超过图层范围,先按比例缩放:
    if (img.Width > customLayer.Width || img.Height > customLayer.Height)
    {
        img.Resize(customLayer.Width, customLayer.Height, ResizeType.HighQualityResample);
    }
    

3. 修复合并图层流程

合并前确保新图层格式、尺寸与目标图层匹配,合并后清理临时图层:

await using var psdStream = new MemoryStream(overlayPsdFile);
using var psdImage = (PsdImage)Image.Load(psdStream);

var customLayer = psdImage.Layers.FirstOrDefault(l => l.Name == "customlayer");
var imageBytes = await _fileService.GetFile(baseFile.Id);

await using var rootImageStream = new MemoryStream(imageBytes);
using var sourceImg = (RasterImage)Image.Load(rootImageStream);

// 统一格式和尺寸
sourceImg.ChangePixelFormat(customLayer.PixelFormat);
sourceImg.Resize(customLayer.Width, customLayer.Height, ResizeType.HighQualityResample);

var newLayer = new Layer(sourceImg);
psdImage.AddLayer(newLayer);
newLayer.MergeLayerTo(customLayer);
psdImage.Layers.Remove(newLayer); // 删除临时图层

// 保存结果
await using var imageOutStream = new MemoryStream();
psdImage.Save(imageOutStream, new PngOptions());

4. 更新Aspose.PSD版本

旧版本可能存在像素格式处理的bug,更新到最新版可解决部分兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:40:32