Aspose.PSD merging or DrawImage fails Source Array not long enough error

Viewed 25

I'm currently attempting to Draw an image on a layer using Aspose.PSD. I have tried so many different ways to make this work.

Approach #1:

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); <--- error here
  
  // if I don't merge the layers, the below code throws an exception
  await using var imageOutStream = new MemoryStream();
  psdImage.Save(imageOutStream, new PngOptions());
}

enter image description here

Approach #2:

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); // <-- error here
  }
}

enter image description here

1 Answers

So after much experimentation, the solution to this problem was removing the using statement.

Approach #1

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);
{
  var layer = new Layer(new MemoryStream(imageBytes));
  psdImage.AddLayer(layer);
  
  await using var imageOutStream = new MemoryStream();
  psdImage.Save(imageOutStream, new PngOptions());
}

when I initialized a new MemoryStream within the new Layer() constructor, it seemed to resolve the issue. The behaviour seems incorrect to me, but I have yet to still confirm that this doesn't result in memory leak issues.

Related