Notas da Versão Aspose.PSD para .NET 23.5

Chave Resumo Categoria
PSDNET-343 Suporte ao filtro: Sharpen -> Sharpen Recurso
PSDNET-1179 Arquivo PSD (RGB/8 bits ou RGB/16 bits) salvando sem camadas em 32 bits Recurso
PSDNET-1408 Implementar manipulação de objetos de caminho de recursos vsms ou vmsk para ShapeLayer Recurso
PSDNET-1508 Adicionar a influência dos pontos de grade um no outro Recurso

Mudanças na API Pública

APIs Adicionadas:

  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.#ctor
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.Key
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.Layers
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.Length
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.PsdVersion
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.Signature
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.LrXxResource.Save(Aspose.PSD.StreamContainer,System.Int32)
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath.IsInverted
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath.IsNotLinked
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath.IsDisabled
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath.GetItems
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPath.SetItems(Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape[])
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape.IsClosed
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape.PathOperations
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape.GetItems
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape.SetItems(Aspose.PSD.FileFormats.Core.VectorPaths.BezierKnotRecord[])
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IStrokeSettings
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.#ctor
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.#ctor(Aspose.PSD.FileFormats.Core.VectorPaths.LengthRecord,Aspose.PSD.FileFormats.Core.VectorPaths.BezierKnotRecord[])
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.IsClosed
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.PathOperations
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.ShapeIndex
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.GetItems
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.SetItems(Aspose.PSD.FileFormats.Core.VectorPaths.BezierKnotRecord[])
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.PathShape.ToVectorPathRecords
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.IsFillStartsWithAllPixels
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.FillColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.Version
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.IsDisabled
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.IsNotLinked
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.IsInverted
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.GetItems
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.SetItems(Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IPathShape[])
  • T:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter
  • M:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter.#ctor
  • M:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter.#ctor(Aspose.PSD.FileFormats.Psd.Layers.LayerResources.TypeToolInfoStructures.DescriptorStructure)
  • P:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter.Name
  • P:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter.FilterId
  • F:Aspose.PSD.FileFormats.Psd.Layers.SmartFilters.SharpenSmartFilter.FilterType

APIs Removidas:

  • M:Aspose.PSD.FileFormats.Core.VectorPaths.VectorPathRecordFactory.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.Key
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.Layers
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.Length
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.PsdVersion
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.Signature
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr16Resource.Save(Aspose.PSD.StreamContainer,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.#ctor(System.Int32)
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.Key
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.Layers
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.Length
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.PsdVersion
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.Signature
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.Lr32Resource.Save(Aspose.PSD.StreamContainer,System.Int32)

Exemplos de Uso:

PSDNET-343. Suporte ao Filtro: Sharpen -> Sharpen

string arquivoOrigem = "fonte_de_afiacao.psd";
string psdSaida = "psd_de_afiacao.psd";
string pngSaida = "png_de_afiacao.png";

void AssertSaoIguais(object esperado, object atual)
{
    if (!object.Equals(esperado, atual))
    {
        throw new Exception("Os objetos não são iguais.");
    }
}

using (var imagem = (PsdImage)Image.Load(arquivoOrigem))
{
    SmartObjectLayer camadaObjetoInteligente = (SmartObjectLayer)imagem.Layers[1];

    // editar filtros inteligentes
    SharpenSmartFilter afiacao = (SharpenSmartFilter)camadaObjetoInteligente.SmartFilters.Filters[0];

    // verificar valores do filtro
    AssertSaoIguais(BlendMode.Normal, afiacao.BlendMode);
    AssertSaoIguais(100d, afiacao.Opacity);
    AssertSaoIguais(true, afiacao.IsEnabled);

    // atualizar valores do filtro
    afiacao.BlendMode = BlendMode.Divide;
    afiacao.Opacity = 75;
    afiacao.IsEnabled = false;

    // adicionar novos itens de filtro
    var filtros = new List<SmartFilter>(camadaObjetoInteligente.SmartFilters.Filters);
    filtros.Add(new SharpenSmartFilter());
    camadaObjetoInteligente.SmartFilters.Filters = filtros.ToArray();

    // aplicar alterações
    camadaObjetoInteligente.SmartFilters.UpdateResourceValues();
    camadaObjetoInteligente.UpdateModifiedContent();

    imagem.Save(psdSaida);
    imagem.Save(pngSaida, new PngOptions());
}

PSDNET-1179. Arquivo PSD (RGB/8 bits ou RGB/16 bits) salvando sem camadas para 32 bits

string arquivoEntrada = "entrada_8bit_rle.psd";
string arquivoPsdSaida = "saida_32bit.psd";
string arquivoImagemSaida32 = "saida_de_32bit.png";

using (PsdImage imgSrc = (PsdImage)Image.Load(arquivoEntrada))
{
    PsdOptions opcoesTotais = new PsdOptions() { ChannelBitsCount = 32, ColorMode = ColorModes.Rgb };
    imgSrc.Save(arquivoPsdSaida, opcoesTotais);

    using (var img32 = Image.Load(arquivoPsdSaida))
    {
        img32.Save(arquivoImagemSaida32, new PngOptions() { ColorType = PSD.FileFormats.Png.PngColorType.TruecolorWithAlpha });
    }
}

PSDNET-1408. Implementar manipulação de objetos de caminho de recursos vsms ou vmsk para ShapeLayer

string arquivoFonte = "ShapeLayerTest.psd";
string arquivoSaida = "ShapeLayerTest-saida.psd";

using (PsdImage imagem = (PsdImage)Image.Load(arquivoFonte, new PsdLoadOptions { LoadEffectsResource = true }))
{
    Layer camadaForma = imagem.Layers[1];
    VectorPathDataResource recursoDadosCaminhoVetorial = (VectorPathDataResource)camadaForma.Resources[1];

    bool preencherIniciaComTodosOsPixels;
    List<IPathShape> formas = ObterFormasDoRecurso(recursoDadosCaminhoVetorial, out preencherIniciaComTodosOsPixels);

    // Remover uma forma
    formas.RemoveAt(1);

    // Salvar dados alterados no recurso
    List<VectorPathRecord> caminho = new List<VectorPathRecord>();
    caminho.Add(new PathFillRuleRecord(null));
    caminho.Add(new InitialFillRuleRecord(preencherIniciaComTodosOsPixels));

    for (ushort i = 0; i < formas.Count; i++)
    {
        PathShape forma = (PathShape)formas[i];
        forma.ShapeIndex = i;
        caminho.AddRange(forma.ToVectorPathRecords());
    }

    recursoDadosCaminhoVetorial.Paths = caminho.ToArray();

    imagem.Save(arquivoSaida);
}

// Verificar valores alterados no arquivo salvo
using (PsdImage imagem = (PsdImage)Image.Load(arquivoSaida, new PsdLoadOptions { LoadEffectsResource = true }))
{
    Layer camadaForma = imagem.Layers[1];
    VectorPathDataResource recursoDadosCaminhoVetorial = (VectorPathDataResource)camadaForma.Resources[1];

    bool preencherIniciaComTodosOsPixels;
    List<IPathShape> formas = ObterFormasDoRecurso(recursoDadosCaminhoVetorial, out preencherIniciaComTodosOsPixels);

    // O arquivo salvo deve ter 1 forma
    AssertSaoIguais(1, formas.Count);
}

void AssertSaoIguais(object esperado, object atual, string mensagem = null)
{
    if (!object.Equals(esperado, atual))
    {
        throw new Exception(mensagem ?? "Os objetos não são iguais.");
    }
}

List<IPathShape> ObterFormasDoRecurso(VectorPathDataResource recursoDadosCaminhoVetorial, out bool preencherIniciaComTodosOsPixels)
{
    List<IPathShape> formas = new List<IPathShape>();
    LengthRecord registroComprimento = null;
    preencherIniciaComTodosOsPixels = false;
    List<BezierKnotRecord> registrosPontoCurva = new List<BezierKnotRecord>();

    foreach (var registroCaminho in recursoDadosCaminhoVetorial.Paths)
    {
        if (registroCaminho is LengthRecord)
        {
            if (registrosPontoCurva.Count > 0)
            {
                formas.Add(new PathShape(registroComprimento, registrosPontoCurva.ToArray()));
                registroComprimento = null;
                registrosPontoCurva.Clear();
            }

            registroComprimento = (LengthRecord)registroCaminho;
        }
        else if (registroCaminho is BezierKnotRecord)
        {
            registrosPontoCurva.Add((BezierKnotRecord)registroCaminho);
        }
        else if (registroCaminho is InitialFillRuleRecord)
        {
            InitialFillRuleRecord registroRegraPreenchimentoInicial = (InitialFillRuleRecord)registroCaminho;
            preencherIniciaComTodosOsPixels = registroRegraPreenchimentoInicial.IsFillStartsWithAllPixels;
        }
    }

    if (registrosPontoCurva.Count > 0)
    {
        formas.Add(new PathShape(registroComprimento, registrosPontoCurva.ToArray()));
        registroComprimento = null;
        registrosPontoCurva.Clear();
    }

    return formas;
}

PSDNET-1508. Adicionar a influência dos pontos de grade um no outro

string arquivoFonte = "Bottom_Right.psd";
string arquivoSaida = "saida.png";

using (var imagem = (PsdImage)Image.Load(arquivoFonte, new PsdLoadOptions { AllowWarpRepaint = true }))
{
    imagem.Save(arquivoSaida, new PngOptions { ColorType = PngColorType.TruecolorWithAlpha});
}