Aspose.PSD para .NET 19.9 - Notas de Lançamento

Chave Resumo Categoria
PSDNET-160 Nome da camada extraído incorretamente Recurso
PSDNET-175 Obtenção de propriedades de texto de uma parte diferente de texto dentro da camada de texto PSD Recurso
PSDNET-190 Suporte para Adicionar grupo de camadas Recurso
PSDNET-192 Suporte da Propriedade de Escala para Camada de Preenchimento Gradiente Recurso
PSDNET-162 Ajustando o Brilho Melhoria
PSDNET-174 IndexOutOfRangeException ao salvar imagem PSD como JPEG Erro
PSDNET-180 Atualização de texto da camada de texto gera uma exceção Erro
PSDNET-182 Salvar imagem PSD após operação RotateFlip produz um arquivo corrompido que não pode ser aberto Erro

Alterações na API Pública

APIs Adicionadas:

  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerGroup.AddLayerGroup(System.String,System.Int32)
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.IText
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.Items
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.Text
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.ProducePortion
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.AddPortion(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.InsertPortion(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion,System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.RemovePortion(System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.IText.UpdateLayerData
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Justification
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.FirstLineIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.StartIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.EndIndent
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.SpaceBefore
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.SpaceAfter
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.AutoHyphenate
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.HyphenatedWordSize
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.PreHyphen
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.PostHyphen
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.ConsecutiveHyphens
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Zone
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.WordSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.LetterSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.GlyphSpacing
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.AutoLeading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.LeadingType
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Hanging
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Burasagari
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.KinsokuOrder
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.EveryLineComposer
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.Apply(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph.IsEqual(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextParagraph)
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Text
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Style
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextPortion.Paragraph
  • T:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.FontSize
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.AutoLeading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Leading
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Tracking
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Kerning
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.FillColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.StrokeColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.HindiNumbers
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.Apply(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle)
  • M:Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle.IsEqual(Aspose.PSD.FileFormats.Psd.Layers.Text.ITextStyle)
  • P:Aspose.PSD.FileFormats.Psd.Layers.TextLayer.TextData
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IGradientFillSettings.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GdFlResource.Scale
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientFillSettings.Scale

APIs Removidas:

  • Nenhuma

Exemplos de Uso:

PSDNET-160. Nome da camada extraído incorretamente

Para exibir corretamente o nome da camada, use a propriedade DisplayName. Um setter foi adicionado para esta propriedade e a propriedade pode ser modificada. Quando o Photoshop está salvando o nome da camada usando a propriedade Nome, os caracteres coreanos são armazenados como byte 63'?' em ASCII. Use a propriedade DisplayName porque a propriedade Nome não suporta caracteres coreanos.

             // faça alterações nos nomes das camadas e salve

            using (var image = (PsdImage)Image.Load("camadas_com_nomes.psd"))

            {

                for (int i = 0; i < image.Layers.Length; i++)

                {

                    var camada = image.Layers[i];

                    // define novo valor na propriedade DisplayName

                    camada.DisplayName += "_alterado";

                }

                image.Save("saida.psd");

            }

PSDNET-175. Obtendo propriedades de texto de uma parte diferente de texto dentro da camada de texto PSD

            const double Tolerancia = 0.0001;

            var caminhoArquivo = "ParagrafosTresCores.psd";

            var caminhoSaida = "ParagrafosTresCores_saida.psd";

            using (var im = (PsdImage)Image.Load(caminhoArquivo))

            {

                for (int i = 0; i < im.Layers.Length; i++)

                {

                    var camada = im.Layers[i] as TextLayer;

                    if (camada != null)

                    {

                        var porcoes = camada.TextData.Items;

                        if (porcoes.Length != 4)

                        {

                            throw new Exception();

                        }

                        // Verificando o texto de cada parte

                        if (porcoes[0].Text != "Antigo " ||

                            porcoes[1].Text != "cor" ||

                            porcoes[2].Text != " texto\r" ||

                            porcoes[3].Text != "Segundo parágrafo\r")

                        {

                            throw new Exception();

                        }

                        // Verificando dados de parágrafos

                        // Parágrafos possuem justificação diferente

                        if (

                            porcoes[0].Paragraph.Justification != 0 ||

                            porcoes[1].Paragraph.Justification != 0 ||

                            porcoes[2].Paragraph.Justification != 0 ||

                            porcoes[3].Paragraph.Justification != 2)

                        {

                            throw new Exception();

                        }

                        // Todas as outras propriedades do primeiro e segundo parágrafo são iguais

                        for (int j = 0; j < porcoes.Length; j++)

                        {

                            var paragrafo = porcoes[j].Paragraph;

                            if (Math.Abs(paragrafo.AutoLeading - 1.2) > Tolerancia ||

                                paragrafo.AutoHyphenate != false ||

                                paragrafo.Burasagari != false ||

                                paragrafo.ConsecutiveHyphens != 8 ||

                                Math.Abs(paragrafo.StartIndent) > Tolerancia ||

                                Math.Abs(paragrafo.EndIndent) > Tolerancia ||

                                paragrafo.EveryLineComposer != false ||

                                Math.Abs(paragrafo.FirstLineIndent) > Tolerancia ||

                                paragrafo.GlyphSpacing.Length != 3 ||

                                Math.Abs(paragrafo.GlyphSpacing[0] - 1) > Tolerancia ||

                                Math.Abs(paragrafo.GlyphSpacing[1] - 1) > Tolerancia ||

                                Math.Abs(paragrafo.GlyphSpacing[2] - 1) > Tolerancia ||

                                paragrafo.Hanging != false ||

                                paragrafo.HyphenatedWordSize != 6 ||

                                paragrafo.KinsokuOrder != 0 ||

                                paragrafo.LetterSpacing.Length != 3 ||

                                Math.Abs(paragrafo.LetterSpacing[0]) > Tolerancia ||

                                Math.Abs(paragrafo.LetterSpacing[1]) > Tolerancia ||

                                Math.Abs(paragrafo.LetterSpacing[2]) > Tolerancia ||

                                paragrafo.LeadingType != LeadingMode.Auto ||

                                paragrafo.PreHyphen != 2 ||

                                paragrafo.PostHyphen != 2 ||

                                Math.Abs(paragrafo.SpaceBefore) > Tolerancia ||

                                Math.Abs(paragrafo.SpaceAfter) > Tolerancia ||

                                paragrafo.WordSpacing.Length != 3 ||

                                Math.Abs(paragrafo.WordSpacing[0] - 0.8) > Tolerancia ||

                                Math.Abs(paragrafo.WordSpacing[1] - 1.0) > Tolerancia ||

                                Math.Abs(paragrafo.WordSpacing[2] - 1.33) > Tolerancia ||

                                Math.Abs(paragrafo.Zone - 36.0) > Tolerancia)

                            {

                                throw new Exception();

                            }

                        }

                        // Verificando dados de estilos

                        // Estilos possuem cores e tamanhos de fonte diferentes

                        if (Math.Abs(porcoes[0].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porcoes[1].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porcoes[2].Style.FontSize - 12) > Tolerancia ||

                            Math.Abs(porcoes[3].Style.FontSize - 10) > Tolerancia)

                        {

                            throw new Exception();

                        }

                        if (porcoes[0].Style.FillColor != Color.FromArgb(255, 145, 0, 0) ||

                            porcoes[1].Style.FillColor != Color.FromArgb(255, 201, 128, 2) ||

                            porcoes[2].Style.FillColor != Color.FromArgb(255, 18, 143, 4) ||

                            porcoes[3].Style.FillColor != Color.FromArgb(255, 145, 42, 100))

                        {

                            throw new Exception();

                        }

                        for (int j = 0; j < porcoes.Length; j++)

                        {

                            var estilo = porcoes[j].Style;

                            if (estilo.AutoLeading != false ||

                                estilo.HindiNumbers != false ||

                                estilo.Kerning != 0 ||

                                estilo.Leading != 0 ||

                                estilo.StrokeColor != Color.FromArgb(255, 175, 90, 163) ||

                                estilo.Tracking != 50)

                            {

                                throw new Exception();

                            }

                        }

                        // Exemplo de edição de texto

                        porcoes[0].Text = "Olá ";

                        porcoes[1].Text = "Mundo";

                        // Exemplo de remoção de porções de texto

                        camada.TextData.RemovePortion(3);

                        camada.TextData.RemovePortion(2);

                        // Exemplo de adicionar nova porção de texto

                        var porcaoCriada = camada.TextData.ProducePortion();

                        porcaoCriada.Text = "!!!\r";

                        camada.TextData.AddPortion(porcaoCriada);

                        porcoes = camada.TextData.Items;

                        // Exemplo de edição de parágrafo e estilo para porções

                        // Definir justificação à direita

                        porcoes[0].Paragraph.Justification = 1;

                        porcoes[1].Paragraph.Justification = 1;

                        porcoes[2].Paragraph.Justification = 1;

                        // Cores diferentes para cada estilo. Serão alteradas, mas a renderização não é totalmente suportada

                        porcoes[0].Style.FillColor = Color.Aquamarine;

                        porcoes[1].Style.FillColor = Color.Violet;

                        porcoes[2].Style.FillColor = Color.LightBlue;

                        // Fonte diferente. Serão alteradas, mas a renderização não é totalmente suportada

                        porcoes[0].Style.FontSize = 6;

                        porcoes[1].Style.FontSize = 8;

                        porcoes[2].Style.FontSize = 10;

                        camada.TextData.UpdateLayerData();

                        im.Save(caminhoSaida, new PsdOptions(im));

                        break;

                    }

                }

            }

PSDNET-190. Suporte para Adicionar grupo de camadas

             // -Grupo 1

            // --Camada 1

            // --Grupo 2

            // ---Camada 2

            // ---Camada 3

            // --Camada 4

            string diretorioDados = "teste_psdnet190.psd";

            var opcoesCriar = new PsdOptions();

            opcoesCriar.Source = new FileCreateSource(diretorioDados, false);

            opcoesCriar.Palette = new PsdColorPalette(new Color[] { Color.Green });

            using (var imagemPSD = (PsdImage)Image.Create(opcoesCriar, 500, 500))

            {

                LayerGroup grupo1 = imagemPSD.AddLayerGroup("Grupo 1", 0, true);

                Layer camada1 = new Layer(imagemPSD);

                camada1.Name = "Camada 1";

                grupo1.AddLayer(camada1);

                LayerGroup grupo2 = grupo1.AddLayerGroup("Grupo 2", 1);

                Layer camada2 = new Layer(imagemPSD);

                camada2.Name = "Camada 2";

                grupo2.AddLayer(camada2);

                Layer camada3 = new Layer(imagemPSD);

                camada3.Name = "Camada 3";

                grupo2.AddLayer(camada3);

                Layer camada4 = new Layer(imagemPSD);

                camada4.Name = "Camada 4";

                grupo1.AddLayer(camada4);

                imagemPSD.Save();

            }

PSDNET-192. Suporte da Propriedade de Escala para Camada de Preenchimento Gradiente

            using (var imagem = (PsdImage)Image.Load("CamadaPreenchimentoGradiente.psd"))

            {

                // obtendo uma camada de preenchimento

                FillLayer camadaPreenchimento = null;

                foreach (var camada in imagem.Layers)

                {

                    camadaPreenchimento = camada as FillLayer;

                    if (camadaPreenchimento != null)

                    {

                        break;

                    }

                }

                var configuracoes = camadaPreenchimento.FillSettings as IGradientFillSettings;

                // atualizar valor de escala

                configuracoes.Scale = 200;

                camadaPreenchimento.Update(); // Atualiza dados de pixels

                imagem.Save("imagem_escalonada.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });

            }

PSDNET-174. IndexOutOfRangeException ao salvar imagem PSD como JPEG

         using (var imagem = Aspose.PSD.Image.Load("AmostraPSD.psd"))

        {

            imagem.Save("amostraJPG.jpg", new JpegOptions());

        }

PSDNET-180. Atualização de texto na camada de texto gera uma exceção

           // Atualização de texto na camada de texto gera uma exceção

            string caminhoArquivo = "InverterVerticalmente.psd";