Aspose.PSD合并图层或DrawImage报错:源数组长度不足如何解决?
Aspose.PSD绘制图像到图层时出现「源数组长度不足」错误的解决方案
问题重现
尝试用Aspose.PSD在指定图层绘制图像,两种方法均触发「源数组长度不足」错误:
方法一:新建图层合并到目标图层
执行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()); }方法二:直接调用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
相关产品推荐
相关产品推荐

