Aspose.PSD for .NET 23.4 - บันทึกการอัปเดต

Key สรุป หมวดหมู่
PSDNET-1409 ออกแบบคลาส RawColor สำหรับ API สาธารณะเพื่อใช้ใน PSD API แทน Color struct ที่ล้าสมัย การปรับปรุง
PSDNET-1332 ผสานระดับความชัดของแผนที่การปรับแต่งแบบ Gradient Map จากการทดสอบเข้ากับโค้ดหลักของ Aspose.PSD คุณลักษณะ
PSDNET-1448 การแก้ไขข้อความโดยใช้ Text Portions ไม่บันทึกผลลัพธ์ที่ถูกต้อง บั๊ก
PSDNET-1449 จุดเริ่มต้นและสิ้นสุดของสไตล์หรือย่อหน้าปรากฏในตำแหน่งไม่ถูกต้องเมื่อแก้ไข Text Layer โดย ITextPortion บั๊ก
PSDNET-1509 การจัดรูปแบบเมื่อแก้ไขใน Photoshop บั๊ก

การเปลี่ยนแปลงใน Public API

เพิ่ม APIs:

  • T:Aspose.PSD.FileFormats.Psd.Layers.Gradient.GradientKind
  • F:Aspose.PSD.FileFormats.Psd.Layers.Gradient.GradientKind.Solid
  • F:Aspose.PSD.FileFormats.Psd.Layers.Gradient.GradientKind.Noise
  • T:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.#ctor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Signature
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Key
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Length
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.PsdVersion
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Save(Aspose.PSD.StreamContainer,System.Int32)
  • F:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.TypeToolKey
  • M:Aspose.PSD.FileFormats.Psd.Layers.Layer.Save(System.IO.Stream)
  • P:Aspose.PSD.FileFormats.Psd.Layers.FillSettings.GradientColorPoint.ColorMode
  • M:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.SetPsdVersion(System.UInt16)
  • T:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.#ctor(System.Byte,System.String)
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.PermittedFullNames
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.BitDepth
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.Value
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.Name
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.Description
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent.FullName
  • T:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.#ctor(Aspose.PSD.FileFormats.Psd.Core.RawColor.ColorComponent[])
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.Components
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.GetColorModeName
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.GetBitDepth
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.GetAsInt
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.SetAsInt(System.Int32)
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.GetAsLong
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.SetAsLong(System.Int64)
  • M:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.#ctor(Aspose.PSD.PixelDataFormat,System.Int16)
  • P:Aspose.PSD.FileFormats.Psd.Core.RawColor.RawColor.ColorMode
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Reverse
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Dither
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.GradientName
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.ExpansionCount
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Interpolation
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.GradientMode
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.RndNumberSeed
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.ShowTransparency
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.UseVectorColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.Roughness
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.ColorModel
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.ColorPoints
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.TransparencyPoints
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.MinimumColor
  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.GrdmResource.MaximumColor

API ที่ถูกลบออก:

  • None

ตัวอย่างการใช้:

PSDNET-1332. ผสานระดับความชัดของแผนที่การปรับแต่งแบบ Gradient Map จากการทดสอบเข้ากับโค้ดหลักของ Aspose.PSD

string sourceFile = "gradient_map_default.psd";
string outputFile = "gradient_map_res.psd";

using (var image = (PsdImage)Image.Load(sourceFile, new PsdLoadOptions()))
{
    Layer layer = image.Layers[1];
    GrdmResource grdmResource = (GrdmResource)layer.Resources[0];

    // ตรวจสอบค่าปัจจุบัน
    AssertAreEqual(false, grdmResource.Reverse);
    AssertAreEqual((ulong)65535, grdmResource.ColorPoints[1].RawColor.Components[2].Value);
    AssertAreEqual((ulong)65535, grdmResource.ColorPoints[1].RawColor.Components[3].Value);

    grdmResource.Reverse = true;
    // สีแดงสำหรับจุดสีโทนที่สอง
    grdmResource.ColorPoints[1].RawColor.Components[1].Value = ushort.MaxValue;
    grdmResource.ColorPoints[1].RawColor.Components[2].Value = 0;
    grdmResource.ColorPoints[1].RawColor.Components[3].Value = 0;

    image.Save(outputFile, new PsdOptions());
}

using (var image = (PsdImage)Image.Load(outputFile))
{
    Layer layer = image.Layers[1];
    GrdmResource grdmResource = (GrdmResource)layer.Resources[0];

    // ตรวจสอบค่าที่เปลี่ยนแล้ว
    AssertAreEqual(true, grdmResource.Reverse);
    AssertAreEqual((ulong)0, grdmResource.ColorPoints[1].RawColor.Components[2].Value);
    AssertAreEqual((ulong)0, grdmResource.ColorPoints[1].RawColor.Components[3].Value);
}

void AssertAreEqual(object expected, object actual, string message = null)
{
    if (!object.Equals(expected, actual))
    {
        throw new Exception(message ?? "Objects are not equal.");
    }
}

PSDNET-1409. ออกแบบคลาส RawColor สำหรับ API สาธารณะเพื่อใช้ใน PSD API แทน Color struct ที่ล้าสมัย

void AssertAreEqual(object expected, object actual, string message = null)
{
    if (!object.Equals(expected, actual))
    {
        throw new Exception(message ?? "Objects are not equal.");
    }
}

var color = new RawColor(PixelDataFormat.Rgba32Bpp);
var oldColor = Color.FromArgb(5, 1, 2, 3);

var argbValue = oldColor.ToArgb();
color.SetAsInt(argbValue);

AssertAreEqual("ARGB", color.GetColorModeName());
AssertAreEqual(32, color.GetBitDepth());
AssertAreEqual("A Alpha", color.Components[0].FullName);
AssertAreEqual(5, (int)color.Components[0].Value);
AssertAreEqual("R Red", color.Components[1].FullName);
AssertAreEqual(1, (int)color.Components[1].Value);
AssertAreEqual("G Green", color.Components[2].FullName);
AssertAreEqual(2, (int)color.Components[2].Value);
AssertAreEqual("B Blue", color.Components[3].FullName);
AssertAreEqual(3, (int)color.Components[3].Value);

AssertAreEqual(argbValue, color.GetAsInt());

PSDNET-1448. การแก้ไขข้อความโดยใช้ Text Portions ไม่บันทึกผลลัพธ์ที่ถูกต้อง

string sourceFile = "originalv5.psd";
string psdExportPath = "export.psd";

using (var imageTestEmail = (PsdImage)Image.Load(sourceFile))
{
    var layers = imageTestEmail.Layers;
    foreach (var layerItem in layers)
    {
        var isTextLayer = layerItem.GetType() == typeof(TextLayer) ? true : false;
        if (isTextLayer)
        {
            var layerTLToUpdateText = (TextLayer)layerItem;

            // ค้นหาข้อความ lsak
            if (layerTLToUpdateText.Text.Contains("lsak"))
            {
                var textDataTL = layerTLToUpdateText.TextData;

                if (textDataTL.Text.Contains("lsak") && textDataTL.Text.Contains("\r"))
                {
                    // แทนที่ข้อความ
                    replaceLsakText(textDataTL);
                    // จัดรูปแบบข้อความ
                    formatStyleText(textDataTL);
                }
            }
        }
    }

    imageTestEmail.Save(psdExportPath, new PsdOptions());
}

string[] texts = new string[]
{
    "Power play.",
    "//Πιο επεκτατικοί κόσμοι. Γρήγοροι χρόνοι φόρτωสีกว้าง. คอมพิวเตอร์ที่ใช้ระบบปฏิบัติการ Windows เสมอจะเป็นแพลตฟอรัง/เกม—และใน Windows 11, มันกลายเป็นดีไ/่ง/ี้ขึ้น/"
};

using (PsdImage psdImage = (PsdImage)Aspose.PSD.Image.Load(psdExportPath))
{
    Txt2Resource txt2OutputResource = (Txt2Resource)psdImage.GlobalLayerResources[1];
    byte[] bytes = txt2OutputResource.Data;
    string txt2Data = "";
    for (int i = 9500; i < bytes.Length; i++)
    {
        if ((char)bytes[i] == '\0')
        {
            txt2Data += "0";
        }
        else
        {
            txt2Data += (char)bytes[i];
        }
    }

    string key0 = @" >> /1 " + texts[0].Length + " >>";       // เติมคำนำหน้าให้กับความยาวของข้อความแรก
    string key1 = @" >> /1 " + texts[1].Length + " >>";       // เติมคำนำหน้าให้กับความยาวของข้อความที่สอง

    int index0 = txt2Data.IndexOf(key0);
    int index1 = txt2Data.IndexOf(key1);

    if (index0 < 0)
    {
        throw new Exception("ค้นหาความยาวของสไตล์ข้อความแรกไม่พบ ต้องเท่ากับ " + texts[0].Length);
    }

    if (index1 < 0)
    {
        throw new Exception("ค้นหาความยาวของสไตล์ข้อความที่สองไม่พบ ต้องเท่ากับ " + texts[1].Length); ;
    }
}

PSDNET-1449. จุดเริ่มต้นและสิ้นสุดของสไตล์หรือย่อหน้าปรากฏในตำแหน่งไม่ถูกต้องเมื่อแก้ไข Text Layer โดย ITextPortion

string sourceFilePSDEmail = "inputv2.psd";
string outputFile = "export.psd";

using (PsdImage imageTestEmail = (PsdImage)Aspose.PSD.Image.Load(sourceFilePSDEmail))
{
    var layers = imageTestEmail.Layers;

    foreach (var layerItem in layers)
    {
        var layerTLToUpdateText = layerItem as TextLayer;

        if (layerTLToUpdateText == null)
        {
            continue;
        }

        //Buscar lsak text
        if (!layerTLToUpdateText.Text.Contains("lsak") ||
            !layerTLToUpdateText.TextData.Text.Contains("lsak"))
        {
            continue;
        }

        var textDataTL = layerTLToUpdateText.TextData;

        //Step: Replace text
        ReplaceLsakFourthMethod(textDataTL);

        System.Console.WriteLine("Replaced text " + textDataTL.Text);

        //Step: Format text
        FormatLsakFourthMethod(textDataTL);

        System.Console.WriteLine("Formated text " + textDataTL.Text);

        //Step: Center textlayer
        if (layerTLToUpdateText.DisplayName.Equals("cc") ||
            layerTLToUpdateText.DisplayName.Equals("tl") ||
            layerTLToUpdateText.DisplayName.Equals("cl"))
        {
            //old Values
            var boundBoxOld = layerTLToUpdateText.TextBoundBox;
            var OldY = layerTLToUpdateText.Top;

            textDataTL.UpdateLayerData();

            // new values
            var wordSize = layerTLToUpdateText.Size;
            var newSize = new Aspose.PSD.Size((int)Math.Ceiling(boundBoxOld.Width), wordSize.Height);
            var beforePoint = CenterInRectangle(wordSize,
                new Aspose.PSD.RectangleF(layerTLToUpdateText.Left, layerTLToUpdateText.Top,
                    layerTLToUpdateText.Width, boundBoxOld.Height));

            layerTLToUpdateText.TextBoundBox =
                new Aspose.PSD.RectangleF(new Aspose.PSD.PointF(0, beforePoint.Y - OldY),
                    newSize);

            var newPoint = CenterInRectangle(wordSize,
                new Aspose.PSD.RectangleF(layerTLToUpdateText.Left, layerTLToUpdateText.Top,
                    layerTLToUpdateText.Width, boundBoxOld.Height));

            layerTLToUpdateText.Left = (int)newPoint.X;
            layerTLToUpdateText.Top = (int)newPoint.Y;

            textDataTL.UpdateLayerData();

            System.Console.WriteLine("Center text");
        }
    }

    imageTestEmail.Save(outputFile);
}

Aspose.PSD.PointF CenterInRectangle(Aspose.PSD.Size Inner, Aspose.PSD.RectangleF Outer)
{
    return new Aspose.PSD.PointF()
    {
        X = (Outer.X + (Outer.Width - Inner.Width) / 2),
        Y = (Outer.Y + (Outer.Height - Inner.Height) / 2)
    };
}

void ReplaceLsakFourthMethod(IText textData)
{
    //validar si tiene tags

    var countPortions = textData.Items.Length;
    ITextStyle defaultStyle = textData.Items[0].Style;
    ITextParagraph defaultParagraph =