Notas de la versión de Aspose.PSD para .NET 23.3

Clave Resumen Categoría
PSDNET-146 Soporte de la capa de ajuste de Posterizar Característica
PSDNET-1366 Implementar soporte de VscgResource Característica
PSDNET-1437 Agregar soporte del recurso PostResource para datos de la capa de ajuste de Posterizar Característica
PSDNET-931 Exportación incorrecta a capa PNG con ajuste de Curvas y modo de color CMYK Error
PSDNET-1403 Se pierde el estilo de párrafo después de guardar y actualizar el archivo por PS Error
PSDNET-1453 Renderizado incorrecto de efectos de resplandor y sombra en texto Error

Cambios en la API pública

APIs añadidas:

  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.IPatternFillSettings.Angle
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.PatternFillSettings.Angle
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Signature
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Key
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Length
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.PsdVersion
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Items
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.KeyForData
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Save(Aspose.PSD.StreamContainer,System.Int32)
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.TypeToolKey

APIs eliminadas:

  • Ninguna

Ejemplos de uso:

PSDNET-146. Soporte de la capa de ajuste de Posterizar

string archivoFuente = "zendeya_posterize.psd";
string archivoSalida = "zendeya_posterize_10.psd";

using (var imagen = (PsdImage)Image.Load(archivoFuente, new PsdLoadOptions()))
{
    foreach (Layer capa in imagen.Layers)
    {
        if (capa is PosterizeLayer)
        {
            ((PosterizeLayer)capa).Levels = 10;
            imagen.Save(archivoSalida);

            break;
        }
    }
}

PSDNET-931. Exportación incorrecta a capa PNG con ajuste de Curvas y modo de color CMYK

string archivoSrc = "input_LevelsLayerWithLayerMaskCmyk.psd";
string archivoSalida = "output_LevelsLayerWithLayerMaskCmykTest.png";
string archivoPsdSalida = "output.psd";

var opcionesCargaPsd = new PsdLoadOptions() { LoadEffectsResource = true };
using (PsdImage imagen = (PsdImage)Image.Load(archivoSrc, opcionesCargaPsd))
{
    imagen.Save(archivoPsdSalida, new PsdOptions()); // la parte ', new PsdOptions()' provoca un error.
    imagen.Save(archivoSalida, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
}

PSDNET-1366. Implementar soporte de VscgResource

string archivoFuente = "StrokeInternalFill_src.psd";
string archivoSalida = "StrokeInternalFill_res.psd";

void SonIguales(double esperado, double actual, double tolerancia = 0.1)
{
    if (Math.Abs(esperado - actual) > tolerancia)
    {
        throw new Exception(
        $"Los valores no son iguales.\nEsperado: {esperado}\nResultado: {actual}\nDiferencia: {esperado - actual}");
    }
}

using (PsdImage imagen = (PsdImage)Image.Load(archivoFuente))
{
    VscgResource vscgResource = (VscgResource)imagen.Layers[1].Resources[0];
    DescriptorStructure estructuraColorRgb = (DescriptorStructure)vscgResource.Items[0];

    SonIguales(89.8, ((DoubleStructure)estructuraColorRgb.Structures[0]).Value);
    SonIguales(219.6, ((DoubleStructure)estructuraColorRgb.Structures[1]).Value);
    SonIguales(34.2, ((DoubleStructure)estructuraColorRgb.Structures[2]).Value);

    ((DoubleStructure)estructuraColorRgb.Structures[0]).Value = 255d; // Rojo
    ((DoubleStructure)estructuraColorRgb.Structures[1]).Value = 0d; // Verde
    ((DoubleStructure)estructuraColorRgb.Structures[2]).Value = 0d; // Azul

    imagen.Save(archivoSalida);
}

// comprobando cambios
using (PsdImage imagen = (PsdImage)Image.Load(archivoSalida))
{
    VscgResource vscgResource = (VscgResource)imagen.Layers[1].Resources[0];
    DescriptorStructure estructuraColorRgb = (DescriptorStructure)vscgResource.Items[0];

    SonIguales(255, ((DoubleStructure)estructuraColorRgb.Structures[0]).Value);
    SonIguales(0, ((DoubleStructure)estructuraColorRgb.Structures[1]).Value);
    SonIguales(0, ((DoubleStructure)estructuraColorRgb.Structures[2]).Value);
}

PSDNET-1403. Estilo de párrafo faltante después de guardar el archivo y actualizarlo por PS

string archivoFuente = "PSDTest3.psd";
string archivoSalida = "output.psd";

string[] nuevoTexto = new string[]
{
    "Título \r",
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus"
};

using (PsdImage imagen = (PsdImage)Aspose.PSD.Image.Load(archivoFuente))
{
    TextLayer capaTexto = imagen.AddTextLayer("Nueva capa", new Aspose.PSD.Rectangle(117, 150, 350, 100));
    var datosTexto = capaTexto.TextData;

    ITextStyle estiloPorDefecto = datosTexto.ProducePortion().Style;

    ITextParagraph párrafoPorDefecto = datosTexto.ProducePortion().Paragraph;
    ITextPortion[] nuevasPorcionesTexto = datosTexto.ProducePortions(nuevoTexto, estiloPorDefecto, párrafoPorDefecto);

    nuevasPorcionesTexto[0].Style.FontSize = 14;
    nuevasPorcionesTexto[0].Style.FontName = "TwCenMT-Bold";

    nuevasPorcionesTexto[1].Style.Leading = 20;
    nuevasPorcionesTexto[1].Style.FontSize = 10;
    nuevasPorcionesTexto[1].Style.FontName = "TwCenMT-Bold";

    // Eliminar el texto anterior
    datosTexto.RemovePortion(0);

    // Agregar nuevas porciones de texto
    foreach (var nuevaPorción in nuevasPorcionesTexto)
    {
        datosTexto.AddPortion(nuevaPorción);
    }

    datosTexto.UpdateLayerData();

    imagen.Save(archivoSalida);
}

using (PsdImage imagenPsd = (PsdImage)Aspose.PSD.Image.Load(archivoSalida))
{
    Txt2Resource recursoTxt2 = (Txt2Resource)imagenPsd.GlobalLayerResources[1];
    byte[] bytes = recursoTxt2.Data;
    string datosTxt2 = "";
    for (int i = 18900; i < bytes.Length; i++)
    {
        datosTxt2 += (char)bytes[i];
    }

    string clave0 = @" >> /6 0 >> >> /1 "; // prefijo de longitud del párrafo 0
    string clave1 = @" >> /6 1 >> >> /1 "; // prefijo de longitud del párrafo 1
    int índice0 = datosTxt2.IndexOf(clave0);
    int índice1 = datosTxt2.IndexOf(clave1);

    string longPar0 = datosTxt2.Substring(índice0 + clave0.Length, 1);
    string longPar1 = datosTxt2.Substring(índice1 + clave1.Length, 3);

    string esperado0 = nuevoTexto[0].Length.ToString();
    string esperado1 = (nuevoTexto[1].Length + 1).ToString();

    if (longPar0 != esperado0 || longPar1 != esperado1)
    {
        throw new Exception(
            $"La longitud de los párrafos es incorrecta.\nEsperado: {esperado0} y {esperado1}\nResultado: {longPar0} y {longPar1}\n");
    }
}

PSDNET-1437. Agregar soporte del recurso PostResource para datos de la capa de ajuste de Posterizar

string archivoFuente = "zendeya_posterize.psd";
string archivoSalida = "zendeya_posterize_10.psd";

using (var imagen = (PsdImage)Image.Load(archivoFuente, new PsdLoadOptions()))
{
    Layer capa = imagen.Layers[1];

    foreach (LayerResource recurso in capa.Resources)
    {
        if (recurso is PostResource)
        {
            ((PostResource)recurso).Levels = 10;
            imagen.Save(archivoSalida);

            break;
        }
    }
}

PSDNET-1453. Renderizado incorrecto de efectos de resplandor y sombra en texto

string archivoPsdSalida = "effect_bug.psd";
string archivoPngSalida = "effect_bug.png";

using (var imagenPsd = new PsdImage(500, 500))
{
    // Agregar capas de texto
    Aspose.PSD.Rectangle áreaTexto1 = new Aspose.PSD.Rectangle(50, 0, 400, 100);
    Aspose.PSD.Rectangle áreaTexto2 = new Aspose.PSD.Rectangle(50, 150, 400, 100);
    Aspose.PSD.Rectangle áreaTexto3 = new Aspose.PSD.Rectangle(50, 300, 400, 100);

    TextLayer capaTexto1 = imagenPsd.AddTextLayer("Texto con Efectos", áreaTexto1);
    TextLayer capaTexto2 = imagenPsd.AddTextLayer("Texto con Efectos", áreaTexto2);
    TextLayer capaTexto3 = imagenPsd.AddTextLayer("Texto con Efectos", áreaTexto3);

    // Modificar capas de texto
    capaTexto1.TextData.Items[0].Style.FontSize = 150;
    capaTexto1.TextData.Items[0].Style.FillColor = Aspose.PSD.Color.Goldenrod;
    capaTexto1.TextData.UpdateLayerData();

    capaTexto2.TextData.Items[0].Style.FontSize = 150;
    capaTexto2.TextData.Items[0].Style.FillColor = Aspose.PSD.Color.Goldenrod;
    capaTexto2.TextData.UpdateLayerData();

    capaTexto3.TextData.Items[0].Style.FontSize = 150;
    capaTexto3.TextData.Items[0].Style.FillColor = Aspose.PSD.Color.Goldenrod;
    capaTexto3.TextData.UpdateLayerData();

    // Agregar efectos
    OuterGlowEffect resplandorExterno = capaTexto1.BlendingOptions.AddOuterGlow(); // romper
    resplandorExterno.Spread = 15;
    ((ColorFillSettings)resplandorExterno.FillColor).Color = Color.Red;

    var sombra = capaTexto2.BlendingOptions.AddDropShadow(); // romper con texto largo
    sombra.Distance = 25;
    sombra.Color = Color.DarkBlue;

    var sombraInterior = capaTexto3.BlendingOptions.AddInnerShadow(); // romper con texto largo
    sombraInterior.UseGlobalLight = false;
    sombraInterior.Angle = -179;
    sombraInterior.Distance = 10;
    sombraInterior.Size = 8;
    sombraInterior.Color = Color.HotPink;

    // exportar
    imagenPsd.Save(archivoPsdSalida);
    imagenPsd.Save(archivoPngSalida, new PngOptions() { ColorType = Aspose.PSD.FileFormats.Png.PngColorType.TruecolorWithAlpha });
}