Aspose.PSD para .NET 23.10 - Notas de la versión

Clave Resumen Categoría
PSDNET-692 Soporte de dirección de texto vertical Característica
PSDNET-1402 Usar ajustes de contorno de recurso vstk en el renderizado de contorno de forma Característica
PSDNET-1607 Implementar renderizado del área interna de formas de contorno Característica
PSDNET-1644 No repintar capa de forma si no ha sido modificada Característica
PSDNET-1696 [Formato AI] Agregar soporte para lectura de encabezado en archivos AI basados en PDF Característica
PSDNET-1560 Varias formas de establecer la resolución del archivo Psd no funcionan Error
PSDNET-1728 FontSettings.SetFontsFolders no funciona o Aspose.PSD utiliza una fuente incorrecta Error
PSDNET-1739 Regresión. Corregir excepción de referencia nula al guardar PsdImage con capa de forma Error

Cambios en la API pública

APIs añadidas:

  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.ColorFillSettings.#ctor
  • M:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.PatternFillSettings.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VstkResource.FillSettings
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.LineCap
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.LineJoin
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.Enabled
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.Size
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.LineDashSet
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.Fill
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.IStrokeSettings.LineAlignment
  • P:Aspose.PSD.FileFormats.Psd.Layers.ShapeLayer.Stroke
  • M:Aspose.PSD.FileFormats.Psd.PsdImage.SetResolution(System.Double,System.Double)
  • T:Aspose.PSD.FileFormats.Psd.Layers.IShapeLayer
  • P:Aspose.PSD.FileFormats.Psd.Layers.IShapeLayer.Path
  • P:Aspose.PSD.FileFormats.Psd.Layers.IShapeLayer.Stroke
  • P:Aspose.PSD.FileFormats.Psd.Layers.IShapeLayer.Fill
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.LineCap
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.LineJoin
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.Enabled
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.Size
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.LineDashSet
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.Fill
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.StrokeSettings.LineAlignment

APIs eliminadas:

  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.IStrokeSettings
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.StrokeResources.VscgResource.Items

Ejemplos de uso:

PSDNET-692. Soporte de dirección de texto vertical

string archivoFuente = "692_lt1.psd";
string archivoSalida = "692_output.png";
string carpetaFuentes = "692_Fonts";

var carpetasFuentes = new List<string>(FontSettings.GetFontsFolders());
carpetasFuentes.Add(carpetaFuentes);
FontSettings.SetFontsFolders(carpetasFuentes.ToArray(), true);

using (PsdImage imagenPsd = (PsdImage)Image.Load(archivoFuente))
{
    imagenPsd.Save(archivoSalida, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
}

PSDNET-1402. Usar ajustes de contorno del recurso vstk en el renderizado de contorno de forma

string archivoFuente = "StrokeShapeTest.psd";
string archivoPsdSalida = "StrokeShapeTest.out.psd";
string archivoPngSalida = "StrokeShapeTest.out.png";

using (PsdImage imagen = (PsdImage)Image.Load(archivoFuente))
{
    Layer capa = imagen.Layers[1];
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    ColorFillSettings ajustesRelleno = (ColorFillSettings)capaForma.Fill;
    ajustesRelleno.Color = Color.GreenYellow;
    capaForma.Update();

    ShapeLayer capaForma2 = (ShapeLayer)imagen.Layers[3];
    GradientFillSettings ajustesDegradado = (GradientFillSettings)capaForma2.Fill;
    ajustesDegradado.Dither = true;
    ajustesDegradado.Reverse = true;
    ajustesDegradado.AlignWithLayer = false;
    ajustesDegradado.Angle = 20;
    ajustesDegradado.Scale = 50;
    ajustesDegradado.ColorPoints[0].Location = 100;
    ajustesDegradado.ColorPoints[1].Location = 4000;
    ajustesDegradado.TransparencyPoints[0].Location = 200;
    ajustesDegradado.TransparencyPoints[1].Location = 3800;
    ajustesDegradado.TransparencyPoints[0].Opacity = 90;
    ajustesDegradado.TransparencyPoints[1].Opacity = 10;
    capaForma2.Update();

    ShapeLayer capaForma3 = (ShapeLayer)imagen.Layers[5];
    StrokeSettings ajustesContorno = (StrokeSettings)capaForma3.Stroke;
    ajustesContorno.Size = 15;
    ColorFillSettings ajustesRellenoContorno = (ColorFillSettings)ajustesContorno.Fill;
    ajustesRellenoContorno.Color = Color.GreenYellow;
    capaForma3.Update();

    imagen.Save(archivoPsdSalida);
    imagen.Save(archivoPngSalida, new PngOptions());
}

// Verificar datos cambiados.
using (PsdImage imagen = (PsdImage)Image.Load(archivoPsdSalida))
{
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    ColorFillSettings ajustesRelleno = (ColorFillSettings)capaForma.Fill;
    AssertAreEqual(Color.GreenYellow, ajustesRelleno.Color);

    ShapeLayer capaForma2 = (ShapeLayer)imagen.Layers[3];
    GradientFillSettings ajustesDegradado = (GradientFillSettings)capaForma2.Fill;
    AssertAreEqual(true, ajustesDegradado.Dither);
    AssertAreEqual(true, ajustesDegradado.Reverse);
    AssertAreEqual(false, ajustesDegradado.AlignWithLayer);
    AssertAreEqual(20.0, ajustesDegradado.Angle);
    AssertAreEqual(50, ajustesDegradado.Scale);
    AssertAreEqual(100, ajustesDegradado.ColorPoints[0].Location);
    AssertAreEqual(4000, ajustesDegradado.ColorPoints[1].Location);
    AssertAreEqual(200, ajustesDegradado.TransparencyPoints[0].Location);
    AssertAreEqual(3800, ajustesDegradado.TransparencyPoints[1].Location);
    AssertAreEqual(90.0, ajustesDegradado.TransparencyPoints[0].Opacity);
    AssertAreEqual(10.0, ajustesDegradado.TransparencyPoints[1].Opacity);

    ShapeLayer capaForma3 = (ShapeLayer)imagen.Layers[5];
    StrokeSettings ajustesContorno = (StrokeSettings)capaForma3.Stroke;
    ColorFillSettings ajustesRellenoContorno = (ColorFillSettings)ajustesContorno.Fill;
    AssertAreEqual(15.0, ajustesContorno.Size);
    AssertAreEqual(Color.GreenYellow, ajustesRellenoContorno.Color);
}

void AssertAreEqual(object esperado, object actual, string mensaje = null)
{
    if (!object.Equals(esperado, actual))
    {
        throw new Exception(mensaje ?? "Los objetos no son iguales.");
    }
}

PSDNET-1607. Implementar el renderizado del área interna de formas de contorno

string archivoFuente = "ShapeInternalGradient.psd";
string archivoSalida = "ShapeInternalGradient.out.psd";

using (PsdImage imagen = (PsdImage)Image.Load(archivoFuente))
{
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    GradientFillSettings ajustesRelleno = (GradientFillSettings)capaForma.Fill;
    ajustesRelleno.Dither = true;
    ajustesRelleno.Reverse = true;
    ajustesRelleno.AlignWithLayer = false;
    ajustesRelleno.Angle = 20.0;
    ajustesRelleno.Scale = 50;
    ajustesRelleno.ColorPoints[0].Location = 100;
    ajustesRelleno.ColorPoints[1].Location = 4000;
    ajustesRelleno.TransparencyPoints[0].Location = 200;
    ajustesRelleno.TransparencyPoints[1].Location = 3800;
    ajustesRelleno.TransparencyPoints[0].Opacity = 90.0;
    ajustesRelleno.TransparencyPoints[1].Opacity = 10.0;

    capaForma.Update();

    imagen.Save(archivoSalida);
}

// Verificar datos cambiados.
using (PsdImage imagen = (PsdImage)Image.Load(archivoSalida))
{
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    GradientFillSettings ajustesRelleno = (GradientFillSettings)capaForma.Fill;

    AssertAreEqual(true, ajustesRelleno.Dither);
    AssertAreEqual(true, ajustesRelleno.Reverse);
    AssertAreEqual(false, ajustesRelleno.AlignWithLayer);
    AssertAreEqual(20.0, ajustesRelleno.Angle);
    AssertAreEqual(50, ajustesRelleno.Scale);
    AssertAreEqual(100, ajustesRelleno.ColorPoints[0].Location);
    AssertAreEqual(4000, ajustesRelleno.ColorPoints[1].Location);
    AssertAreEqual(200, ajustesRelleno.TransparencyPoints[0].Location);
    AssertAreEqual(3800, ajustesRelleno.TransparencyPoints[1].Location);
    AssertAreEqual(90.0, ajustesRelleno.TransparencyPoints[0].Opacity);
    AssertAreEqual(10.0, ajustesRelleno.TransparencyPoints[1].Opacity);
}

void AssertAreEqual(object esperado, object actual, string mensaje = null)
{
    if (!object.Equals(esperado, actual))
    {
        throw new Exception(mensaje ?? "Los objetos no son iguales.");
    }
}

PSDNET-1644. No repintar capa de forma si no ha sido modificada

string archivoFuente = "ShapeInternalSolid.psd";
string archivoSalida = "ShapeInternalSolid.out.psd";

using (PsdImage imagen = (PsdImage)Image.Load(archivoFuente))
{
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    ColorFillSettings ajustesRelleno = (ColorFillSettings)capaForma.Fill;
    ajustesRelleno.Color = Color.Red;

    // No utilizar la actualización de la capa Shape antes de guardar

    imagen.Save(archivoSalida);

    // Verificar renderizado del archivo guardado
}

// Verificar que los datos de la capa de forma permanecen sin cambios.
using (PsdImage imagen = (PsdImage)Image.Load(archivoSalida))
{
    ShapeLayer capaForma = (ShapeLayer)imagen.Layers[1];
    ColorFillSettings ajustesRelleno = (ColorFillSettings)capaForma.Fill;

    AssertAreEqual(Color.FromArgb(45, 211, 31), ajustesRelleno.Color);
}

void AssertAreEqual(object esperado, object actual, string mensaje = null)
{
    if (!object.Equals(esperado, actual))
    {
        throw new Exception(mensaje ?? "Los objetos no son iguales.");
    }
}

PSDNET-1696. [AI Formato] Agregar soporte para lectura de encabezado de archivos AI basados en PDF

string archivoFuente = "ai_source.ai";

void AssertIsNotNull(object esperado)
{
    if (esperado == null)
    {
        throw new Exception("El objeto es nulo.");
    }
}

using (AiImage imagen = (AiImage)Image.Load(archivoFuente))
{
    AssertIsNotNull(imagen);
    AssertIsNotNull(imagen.Header);
    AssertIsNotNull(imagen.Header.BoundingBox);
}

PSDNET-1560. Varias formas de establecer la resolución del archivo Psd no funcionan

string salida1 = "1560_1_output.psd";
string salida2 = "1560_2_output.psd";
string salida3 = "1560_3_output.psd";

using (PsdImage nuevoPsd = (PsdImage)new PsdImage(600, 400))
{
    nuevoPsd.ImageResources = new ResourceBlock[] { new ResolutionInfoResource() };
    nuevoPsd.VerticalResolution = 100;
    nuevoPsd.HorizontalResolution = 100;
    nuevoPsd.Save(salida1);
}

using (PsdImage nuevoPsd = (PsdImage)new PsdImage(600, 400))
{
    nuevoPsd.SetResolution(200, 200);
    nuevoPsd.Save(salida2);
}

using (PsdImage nuevoPsd = (PsdImage)new PsdImage(600, 400))
{
    PsdOptions opcionesPsd = new PsdOptions()
    {
        ResolutionSettings = new ResolutionSetting()
        {
            HorizontalResolution = 300,
            VerticalResolution = 300
        }
    };
    nuevoPsd.Save(salida3, opcionesPsd);
}

using (var psdImagen1 = (PsdImage)Image.Load(salida1))
{
    var recursoRes = psdImagen1.ImageResources[0] as ResolutionInfoResource;

    IsNotNull(recursoRes);
    AreEqual(100, recursoRes.VDpi.Integer);
    AreEqual(100, recursoRes.HDpi.Integer);
}

using (var psdImagen2 = (PsdImage)Image.Load(salida2))
{
    var recursoRes = psdImagen2.ImageResources[0] as ResolutionInfoResource;

    IsNotNull(recursoRes);
    AreEqual(200, recursoRes.VDpi.Integer);
    AreEqual(200, recursoRes.HDpi.Integer);
}

using (var psdImagen3 = (PsdImage)Image.Load(salida3))
{
    var recursoRes = psdImagen3.ImageResources[0] as ResolutionInfoResource;

    IsNotNull(recursoRes);
    AreEqual(300, recursoRes.VDpi.Integer);
    AreEqual(300, recursoRes.HDpi.Integer);
}

void IsNotNull(object obj)
{
    if (obj == null)
    {
        throw new NullReferenceException();
    }
}

void AreEqual(object esperado, object actual)
{
    if (!object.Equals(esperado, actual))
    {
        throw new Exception("Los objetos no son iguales.");
    }
}

PSDNET-1728. FontSettings.SetFontsFolders no funciona o Aspose.PSD utiliza una fuente incorrecta

string src = "1728_Untitled-1.psd";
string fontsDir = "Fonts";
string outputPng = "1728_output.png";

FontSettings.SetFontsFolders(new string[] { fontsDir }, true);
using (PsdImage psdImage = (PsdImage)Image.Load(src))
{
    foreach (var layer in psdImage.Layers)
    {
        if (layer is TextLayer)
        {
            TextLayer textLayer = layer as TextLayer;
            var textData = textLayer.TextData;
            textData.UpdateLayerData();
        }
    }

    psdImage.Save(outputPng, new PngOptions());
}

PSDNET-1739. Regresión. Corregir excepción de referencia nula al guardar PsdImage con capa de forma

string archivoFuente = "ShapeInternalSolid.psd";

using (PsdImage im = (PsdImage)PsdImage.Load(archivoFuente))
{
    // Debería cargarse sin excepciones

    ShapeLayer capaForma = (ShapeLayer)im.Layers[1];

    if (capaForma.RawDataSettings == null)
    {
        throw new Exception("RawDataSettings no deber