如何创建剪贴蒙版?

您好!

我们公司正在评测Aspose.psd框架,想要完成如下功能:

我有原文件src.psd,想要达到dest.psd的效果,在photoshop中,可能通过创建剪贴蒙版来实现,但我在aspose.psd框架中,没能找到好的解决方案,请问使用Aspose.psd框架,要达到这个效果,该怎么做呢?能给我写一个代码片断吗?非常感谢!

psd文件如下:
temp.zip (1.5 MB)

@zhangzhifeng 请检查以下示例:

另外,请检查定价信息。我们有良好的付费支持和付费咨询服务。如果您有大量类似的任务,Aspose Developers 可以帮助您编写代码。

@zhangzhifeng 这里是从 C# 到 Java 的移植代码:

void addRasterMask(LayerMaskData mask, LayerMaskDataShort newShortMask) {
    LayerMaskData mask = layer.getLayerMaskData();
    LayerMaskDataFull fullMask = mask instanceof LayerMaskDataFull ? (LayerMaskDataFull) mask : null;
    boolean hasRasterMask = fullMask != null ||
            (mask != null && (mask.getFlags() & LayerMaskFlags.UserMaskFromRenderingOtherData) == 0);

    if (hasRasterMask) {
        System.out.println("This layer has a raster mask already, updating.");
    }

    if (mask != null) {
        if (fullMask != null) {
            // let's update user raster mask in a full one.
            fullMask.setRealFlags(newMask.getFlags());
            fullMask.setDefaultColor(newMask.getDefaultColor());
            fullMask.setUserMaskRectangle(newMask.getMaskRectangle());
            fullMask.setUserMaskData(newMask.getImageData());
            newMask = fullMask;
        } else if ((mask.getFlags() & LayerMaskFlags.UserMaskFromRenderingOtherData) != 0) {
            // let's convert the short raster mask to a full one.
            fullMask = new LayerMaskDataFull();
            fullMask.setFlags(mask.getFlags());
            fullMask.setMaskRectangle(mask.getMaskRectangle());
            fullMask.setImageData(mask.getImageData());
            fullMask.setRealFlags(newMask.getFlags());
            fullMask.setDefaultColor(newMask.getDefaultColor());
            fullMask.setUserMaskRectangle(newMask.getMaskRectangle());
            fullMask.setUserMaskData(newMask.getImageData());
            newMask = fullMask;
        }
    }

    // Adds or updates a mask
    layer.addLayerMask(newMask);
}

非常感谢您的回复,我们会做进一步的验证开发,如有不懂的地方,再请教您!再次感谢!

好的,我们正在初步了解该框架,也还会进一步做详细了解,如有需求,我会联系你们的,感谢!

1 Like

请问这个问题解决了不,上面的代码未成功呢,请指教,我是用的net

您能否提供您尝试使用的代码、输入文件和预期结果

输入文件: input.png, template.psd, 期望输出文件: output&spotColor.psd, 这三个文件已打包上传到附件。

用.net 或Java, 或C++ 都可以接受。只要能实现上面的期望输出即可。

能写一个现实期望输出的代码示例吗?

谢谢!

temp.zip (7.9 MB)

@zhangzhifeng

请检查以下代码

using (var psdImage = (PsdImage)Image.Load("template.psd", new PsdLoadOptions() { LoadEffectsResource = true }))
 {
 using (var fs = new FileStream(@"input.png", FileMode.Open))
 {
     fs.Position = 0;
     var layer = new Layer(fs);
     {
         var maskLayer = psdImage.Layers[0];
         var mask = maskLayer.LoadArgb32Pixels(maskLayer.Bounds);

         // Get the byte mask
         var byteMask = mask.Select(it => (byte)(it >> 24)).ToArray();
         var layerMask = new LayerMaskDataShort();

         var maskBounds = maskLayer.Bounds;
         maskBounds.Offset(maskLayer.Left, maskLayer.Top);

         layerMask.MaskRectangle = maskBounds;
         layerMask.ImageData = byteMask;
         layer.AddLayerMask(layerMask);

         var layers = new List<Layer>(psdImage.Layers);
         layers.Add(layer);

         layers.RemoveAt(0);
         psdImage.Layers = layers.ToArray();
     }
 }

 psdImage.Save(output);
}