Notas da versão Aspose.PSD para .NET 21.3

Chave Resumo Categoria
PSDNET-823 Adicionar o SectionDividerLayer para melhorar a experiência com grupos de camadas Melhoria
PSDNET-694 Ao ler PattResource, largura e altura foram trocadas Erro
PSDNET-789 Blendagem incorreta de mais de um Efeito de Camada Erro
PSDNET-805 Ordem e lógica de blendagem incorretas quando há mais de um Efeito de Camada Erro
PSDNET-842 Propriedades de efeito de contorno que não são salvas no arquivo PSD Erro

Mudanças na API Pública

APIs Adicionadas:

  • T:Aspose.PSD.FileFormats.Psd.Layers.SectionDividerLayer
  • M:Aspose.PSD.FileFormats.Psd.Layers.SectionDividerLayer.GetRelatedLayerGroup
  • P:Aspose.PSD.FileFormats.Psd.Layers.SectionDividerLayer.IsVisibleInGroup

APIs Removidas:

  • Nenhuma

Exemplos de Uso:

PSDNET-694. Ao ler PattResource, largura e altura foram trocadas

            string arquivoOrigem = "Untitled-1.psd";
            string arquivoSaida = "output.png";

            using (var imagem = (PsdImage)Image.Load(arquivoOrigem))
            {
                var camadaPreenchimento = (FillLayer)imagem.Layers[1];
                camadaPreenchimento.Update(); // invocar renderização de padrão

                imagem.Save(arquivoSaida, new PngOptions());
            }

PSDNET-789. Blendagem incorreta de mais de um Efeito de Camada

            string arquivoFonte = "source_789.psd";
            string caminhoSmartObjectSaida = "output789.png";
            string arquivoSaida = "output789.psd";

            using (PsdImage imagem = (PsdImage)Image.Load(arquivoFonte, new PsdLoadOptions() { LoadEffectsResource = true }))
            {
                var comprimento = imagem.Layers.Length;
                for (int i = 0; i < comprimento; i++)
                {
                    var smart = imagem.Layers[i] as SmartObjectLayer;
                    if (smart != null && smart.Name == "__D__")
                    {
                        using (var stream = new MemoryStream(smart.Contents))
                        {
                            stream.Position = 0;
                            using (var imagemNoSmart = (PsdImage)Image.Load(stream))
                            {
                                for (int j = 0; j < imagemNoSmart.Layers.Length; j++)

                                {
                                    // Procurando pela Camada de Texto
                                    var camadaTexto = imagemNoSmart.Layers[j] as TextLayer;
                                    if (camadaTexto != null)
                                    {
                                        var dadosTexto = camadaTexto.TextData;

                                        dadosTexto.Items[0].Text = "Melhor";
                                        dadosTexto.Items[0].Style.FontSize = 170;
                                    }
                                }

                                smart.ReplaceContents(imagemNoSmart);
                            }
                        }

                        break;
                    }
                }
                // Dessa forma, estamos salvando o arquivo PSD alterado
                imagem.Save(caminhoSmartObjectSaida, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
                imagem.Save(arquivoSaida);
            }

PSDNET-805. Ordem e lógica de blendagem incorretas quando há mais de um Efeito de Camada

            string arquivoOrigem = "1_200x200.psd";
            string arquivoConteudo = "Numbers1Best.png";

            string arquivoSaidaPng = "output.png";
            string arquivoSaidaPsd = "output.psd";

            using (PsdImage imagem = (PsdImage)Image.Load(arquivoOrigem, new PsdLoadOptions() { LoadEffectsResource = true }))
            {
                var comprimento = imagem.Layers.Length;
                for (int i = 0; i < comprimento; i++)
                {
                    var smart = imagem.Layers[i] as SmartObjectLayer;
                    if (smart != null && smart.Name == "__D__")
                    {
                        smart.ReplaceContents(arquivoConteudo);
                        break;
                    }
                }

                //Dessa forma, estamos salvando o arquivo PSD alterado
                imagem.Save(arquivoSaidaPng, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
                imagem.Save(arquivoSaidaPsd);
            }

PSDNET-823. Adicionar o SectionDividerLayer para melhorar a experiência com grupos de camadas

            // O código a seguir demonstra camadas SectionDividerLayer e como obter o grupo de camadas relacionado.

            // Hierarquia de camadas
            //    [0]: '</Layer group>' SectionDividerLayer para Grupo 1
            //    [1]: 'Camada 1' Regular Layer
            //    [2]: '</Layer group>' SectionDividerLayer para Grupo 2
            //    [3]: '</Layer group>' SectionDividerLayer para Grupo 3
            //    [4]: 'Grupo 3' GroupLayer
            //    [5]: 'Grupo 2' GroupLayer
            //    [6]: 'Grupo 1' GroupLayer

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

            using (var imagem = new PsdImage(100, 100))
            {
                // Criando hierarquia de camadas
                // Adiciona o LayerGroup 'Grupo 1'
                LayerGroup grupo1 = imagem.AddLayerGroup("Grupo 1", 0, true);
                // Adiciona camada regular
                Layer camada1 = new Layer();
                camada1.DisplayName = "Camada 1";
                grupo1.AddLayer(camada1);
                // Adiciona o LayerGroup 'Grupo 2'
                LayerGroup grupo2 = grupo1.AddLayerGroup("Grupo 2", 1);
                // Adiciona o LayerGroup 'Grupo 3'
                LayerGroup grupo3 = grupo2.AddLayerGroup("Grupo 3", 0);

                // Obtém os SectionDividerLayer's
                SectionDividerLayer divisor1 = (SectionDividerLayer)imagem.Layers[0];
                SectionDividerLayer divisor2 = (SectionDividerLayer)imagem.Layers[2];
                SectionDividerLayer divisor3 = (SectionDividerLayer)imagem.Layers[3];

                // usando o método SectionDividerLayer.GetRelatedLayerGroup(), obtém a instância relacionada do LayerGroup.
                AssertAreEqual(grupo1.DisplayName, divisor1.GetRelatedLayerGroup().DisplayName); // o mesmo LayerGroup
                AssertAreEqual(grupo2.DisplayName, divisor2.GetRelatedLayerGroup().DisplayName); // o mesmo LayerGroup
                AssertAreEqual(grupo3.DisplayName, divisor3.GetRelatedLayerGroup().DisplayName); // o mesmo LayerGroup

                LayerGroup pasta1 = divisor1.GetRelatedLayerGroup();
                AssertAreEqual(5, pasta1.Layers.Length); // 'Grupo 1' contém 5 camadas
            }

PSDNET-842. Propriedades de efeito de contorno que não são salvas no arquivo PSD

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

            string arquivoFonte = "badStrokeEffect.psd";
            string resultado = "output.psd";

            using (var imagem = (PsdImage)Image.Load(arquivoFonte, new PsdLoadOptions() { LoadEffectsResource = true }))
            {
                var camada1 = new Layer();
                imagem.AddLayer(camada1);
                camada1.BlendingOptions.AddStroke(FillType.Color); // Não lançará ArgumentNullException

                StrokeEffect efeitoContorno = imagem.Layers[1].BlendingOptions.AddStroke(FillType.Color);
                efeitoContorno.Size = 10;
                efeitoContorno.Position = StrokePosition.Outside;
                efeitoContorno.Overprint = true;

                imagem.Save(resultado);
            }

            // Verifica os valores salvos
            using (var imagem = (PsdImage)Image.Load(resultado, new PsdLoadOptions() { LoadEffectsResource = true }))
            {
                StrokeEffect efeitoContorno = (StrokeEffect)imagem.Layers[1].BlendingOptions.Effects[0];

                AssertAreEqual(10, efeitoContorno.Size);
                AssertAreEqual(StrokePosition.Outside, efeitoContorno.Position);
                AssertAreEqual(true, efeitoContorno.Overprint);
            }