Vydání Aspose.PSD pro .NET 23.7

Klíč Shrnutí Kategorie
PSDNET-802 Přidat možnost exportovat každou vrstvu souboru PSD do animovaného souboru GIF Funkce
PSDNET-1441 Přiřadit vlastnost vyplnění vrstvy tvaru ze zdroje vscg Funkce
PSDNET-1534 Přidat nové typy modifikace (arc & arch) Funkce
PSDNET-1543 Změnit aplikaci, která ukládá soubor PSD na Aspose.PSD, pokud je vlastnost UpdateMetadata nastavena na true Funkce
PSDNET-1567 Zvětšit výpočetní oblast obrázku s modifikací Funkce
PSDNET-1471 Vrstvy úpravy černobílých barvy špatně zpracovávají polopropustnost Chyba
PSDNET-1505 Náhrada obsahu SmartObjectu (když je možnost AllowWarpRepaint aktivní) spadne po 2 minutách výpočtu Chyba
PSDNET-1585 Přidat možnost získat skutečnou pozici vrstvy v LayerGroupu Chyba
PSDNET-1589 Změna velikosti vrstvy funguje špatně, když soubor PSD obsahuje VogkResource se strukturami v bodech Chyba
PSDNET-1608 TextBound nefunguje tak, jak se očekává Chyba
PSDNET-1612 Přidání vrstvy vytvořené výchozí konstruktorem do obrázku PSD nevytváří výchozí zdroje Chyba
PSDNET-1623 Timeline.LoopesCount je ignorován při exportu do animovaného GIFu Chyba

Změny ve veřejném rozhraní API

Přidaná API:

  • P:Aspose.PSD.ImageOptions.PsdOptions.UpdateMetadata
  • F:Aspose.PSD.FileFormats.Ai.AiFormatVersion.Pdf16
  • F:Aspose.PSD.FileFormats.Ai.AiFormatVersion.Pdf17
  • P:Aspose.PSD.Xmp.Schemas.XmpBaseSchema.XmpBasicPackage.Item(System.String)
  • M:Aspose.PSD.Xmp.Schemas.XmpBaseSchema.XmpBasicPackage.SetValue(System.String,Aspose.PSD.Xmp.IXmlValue)
  • M:Aspose.PSD.Xmp.Schemas.XmpBaseSchema.XmpBasicPackage.ContainsKey(System.String)
  • P:Aspose.PSD.FileFormats.Psd.Layers.ShapeLayer.Fill

Odebraná API:

  • P:Aspose.PSD.FileFormats.Psd.Layers.LayerResources.VectorPath.FillColor

Příklady použití:

PSDNET-802. Přidat možnost exportovat každou vrstvu souboru PSD do animovaného souboru GIF

string src = "KaždáVrstvaJeRámec.psd";
string outputGif = "out_KazdaVrstvaJeRamec.gif";
string outputPsd = "out_KazdaVrstvaJeRamec.psd";

using (var psdImage = (PsdImage)Image.Load(src))
{
    // Vytvořit snímky pro každou vrstvu.
    int pocetSnimku = psdImage.Layers.Length;
    var timeline = psdImage.Timeline;

    Frame[] snimky = new Frame[pocetSnimku];
    for (int i = 0; i < pocetSnimku; i++)
    {
        snimky[i] = new Frame();
        LayerState[] stavyVrstev = new LayerState[pocetSnimku];

        for (int j = 0; j < pocetSnimku; j++)
        {
            stavyVrstev[j] = new LayerState();
            stavyVrstev[j].Enabled = i == j;
        }

        snimky[i].LayerStates = stavyVrstev;
    }

    timeline.Frames = snimky;

    // Aktualizovat aktuální stavy
    Layer[] vrstvy = psdImage.Layers;
    LayerState[] stavy = timeline.Frames[timeline.ActiveFrameIndex].LayerStates;
    for (int i = 0; i < pocetSnimku; i++)
    {
        vrstvy[i].IsVisible = stavy[i].Enabled;
    }

    timeline.Save(outputGif, new GifOptions());
    psdImage.Save(outputPsd);
}

PSDNET-1441. Přiřadit vlastnost vyplnění vrstvy tvaru ze zdroje vscg

string srcFile = "TvarInterniPlny.psd";
string outFile = "TvarInterniPlny.psd.out.psd";

using (PsdImage image = (PsdImage)Image.Load(
    srcFile,
    new PsdLoadOptions { LoadEffectsResource = true }))
{
    ShapeLayer vrstvaTvaru = (ShapeLayer)image.Layers[1];
    ColorFillSettings nastaveniVyplne = (ColorFillSettings)vrstvaTvaru.Fill;
    nastaveniVyplne.Color = Color.Red;

    vrstvaTvaru.Update();

    image.Save(outFile);
}

// Zkontrolovat uložené změny
using (PsdImage image = (PsdImage)Image.Load(
    outFile,
    new PsdLoadOptions { LoadEffectsResource = true }))
{
    ShapeLayer vrstvaTvaru = (ShapeLayer)image.Layers[1];
    ColorFillSettings nastaveniVyplne = (ColorFillSettings)vrstvaTvaru.Fill;

    AssertAreEqual(Color.Red, nastaveniVyplne.Color);

    image.Save(outFile);
}

void AssertAreEqual(object ocekavano, object skutecne, string zprava = null)
{
    if (!object.Equals(ocekavano, skutecne))
    {
        throw new Exception(zprava ?? "Objekty nejsou stejné.");
    }
}

PSDNET-1471. Vrstvy úpravy černobílých barvy špatně zpracovávají polopropustnost

string srcFile = "zabi_nosymb.psd";
string outFile = "zabi_nosymb.psd.out.psd";

using (PsdImage psdImage = (PsdImage)Image.Load(srcFile))
{
    psdImage.AddBlackWhiteAdjustmentLayer();
    psdImage.Save(outFile);
}

// Zkontrolovat uložené změny
using (PsdImage image = (PsdImage)Image.Load(
    outFile,
    new PsdLoadOptions { LoadEffectsResource = true }))
{
    AssertAreEqual(2, image.Layers.Length);

    BlackWhiteAdjustmentLayer vrstvaUpravCernobile = (BlackWhiteAdjustmentLayer)image.Layers[1];

    if (vrstvaUpravCernobile == null)
    {
        throw new Exception("Vrstva 2 by měla být vrstva úpravy černobílých.");
    }

    image.Save(outFile);
}

void AssertAreEqual(object ocekavano, object skutecne, string zprava = null)
{
    if (!object.Equals(ocekavano, skutecne))
    {
        throw new Exception(zprava ?? "Objekty nejsou stejné.");
    }
}

PSDNET-1505. Náhrada obsahu SmartObjectu (když je možnost AllowWarpRepaint aktivní) spadne po 2 minutách výpočtu

string sourceFile = "hrnek 4.psd";
string changeFile = "umělecké dílo pro nahrazení.png";
string outputFile = "export.png";

int novaVyska = 300;

using (var psdImage = (PsdImage)Image.Load(sourceFile, new PsdLoadOptions() { AllowWarpRepaint = true, LoadEffectsResource = true }))
{
    SmartObjectLayer vrstvaSmartObjektu = (SmartObjectLayer)psdImage.Layers[3];

    var meritko = (double)novaVyska / vrstvaSmartObjektu.Height;
    var novaSirka = (int)Math.Round(vrstvaSmartObjektu.Width * meritko);

    PsdImage vnitrniObrazek = new PsdImage(novaSirka, novaVyska);
    vnitrniObrazek.SetResolution(72, 72);

    Stream vnitrniStream = new FileStream(changeFile, FileMode.Open);
    Layer vrstva = new Layer(vnitrniStream) { HorizontalResolution = 72, VerticalResolution = 72 };
    try
    {
        vnitrniObrazek.AddLayer(vrstva);

        vrstvaSmartObjektu.ReplaceContents(vnitrniObrazek);
        vrstvaSmartObjektu.UpdateModifiedContent();

        psdImage.Save(outputFile, new PngOptions
        {
            ColorType = PngColorType.TruecolorWithAlpha
        });
    }
    finally
    {
        vnitrniObrazek.Dispose();
        vnitrniStream.Dispose();
        vrstva.Dispose();
    }
}

PSDNET-1534. Přidat nové typy modifikace (arc & arch)

string sourceArcFile = "arc_modifikace.psd";
string outputArcFile = "arc_export.png";

string sourceArchFile = "arch_modifikace.psd";
string outputArchFile = "arch_export.png";

using (var psdImage = (PsdImage)Image.Load(sourceArcFile, new PsdLoadOptions() { AllowWarpRepaint = true, LoadEffectsResource = true }))
{
    psdImage.Save(outputArcFile, new PngOptions
    {
        ColorType = PngColorType.TruecolorWithAlpha
    });
}

using (var psdImage = (PsdImage)Image.Load(sourceArchFile, new PsdLoadOptions() { AllowWarpRepaint = true, LoadEffectsResource = true }))
{
    psdImage.Save(outputArchFile, new PngOptions
    {
        ColorType = PngColorType.TruecolorWithAlpha
    });
}

PSDNET-1543. Změnit aplikaci, která ukládá soubor PSD na Aspose.PSD, pokud je vlastnost UpdateMetadata nastavena na true

string cesta = "vystup.psd";
using (var obraz = new PsdImage(100, 100))
{
    // Pokud chcete změnit nástroj vytváření, ujistěte se, že vlastnost "UpdateMetadata" je nastavena na true. Je implicitně nastavena na true.
    var psdVolby = new PsdOptions();
    psdVolby.UpdateMetadata = true;

    // Uložení obrázku. 
    obraz.Save(cesta, psdVolby);

    // Kontrola nástroje vytváření v kódu.
    var xmpData = obraz.XmpData;
    var basicPackage = obraz.XmpData.GetPackage(Namespaces.XmpBasic);

    // Zde bude aktualizována informace o nástroji vytváření.
    var aktualniNastrojVytvareni = (string)basicPackage[":CreatorTool"];
}

PSDNET-1567. Zvětšit výpočetní oblast obrázku s modifikací

string sourceFile = "hrnek4_modifikace.psd";
string outputFile = "hrnek4_export.png";

using (var psdImage = (PsdImage)Image.Load(sourceFile, new PsdLoadOptions() { AllowWarpRepaint = true, LoadEffectsResource = true }))
{
    psdImage.Save(outputFile, new PngOptions
    {
        ColorType = PngColorType.TruecolorWithAlpha
    });
}

PSDNET-1585. Přidat možnost získat skutečnou pozici LayerGroupu vlevo a nahoře

string sourceFile = "vrstvySkupinyObrazu.psd";

void AssertAreEqual(object ocekavano, object skutecne)
{
    if (!object.Equals(ocekavano, skutecne))
    {
        throw new Exception("Objekty nejsou stejné.");
    }
}

using (var obraz = (PsdImage)Image.Load(sourceFile))
{
    var vrstvy = obraz.Layers;

    for (int i = 0; i < vrstvy.Length; i++)
    {
        var vrstva = vrstvy[i];

        if (vrstva is LayerGroup)
        {
            // Získání LayerGroup.
            var skupina = (LayerGroup)vrstva;

            var ocekavanyLevy = int.MaxValue;
            var ocekavanyHorni = int.MaxValue;
            var ocekavanyPravy = 0;
            var ocekavanyDolni = 0;

            // Výpočet skutečných hodnot pozice vlevo, nahoře, vpravo a dole.
            foreach (var vnejsiVrstva in skupina.Layers)
            {
                if (vnejsiVrstva is AdjustmentLayer || vnejsiVrstva.Bounds.IsEmpty)
                {
                    continue;
                }

                ocekavanyLevy = Math.Min(ocekavanyLevy, vnejsiVrstva.Left);
                ocekavanyHorni = Math.Min(ocekavanyHorni, vnejsiVrstva.Top);
                ocekavanyPravy = Math.Max((ocekavanyLevy + skupina.Width), (vnejsiVrstva.Left + vnejsiVrstva.Width));
                ocekavanyDolni = Math.Max((ocekavanyHorni + skupina.Height), (vnejsiVrstva.Top + vnejsiVrstva.Height));
            }

            // Pozice LayerGroup vlevo, nahoře, vpravo a dole jsou nyní počítány správně.
            AssertAreEqual(skupina.Left, ocekavanyLevy);
            AssertAreEqual(skupina.Top, ocekavanyHorni);
            AssertAreEqual(skupina.Right, ocekavanyPravy);
            AssertAreEqual(skupina.Bottom, ocekavanyDolni);
        }
    }
}

PSDNET-1589. Změna velikosti vrstvy funguje špatně, když soubor PSD obsahuje VogkResource se strukturami v bodech

string[] sourceFiles = new string[]
{
    "BodyVectorPuvod.psd",
    "TopVogkResStrukt.psd"
};

foreach (string sourceFile in sourceFiles)
{
    using (PsdImage image = (PsdImage)Image.Load(sourceFile))
    {
        Layer vrstva = image.Layers[0];

        vrstva.Resize(50, 50);

        AssertAreEqual(vrstva.Height, 50);
        AssertAreEqual(vrstva.Width, 50);
    }
}

void AssertAreEqual(object ocekavano, object skutecne, string zprava = null)
{
    if (!object.Equals(ocekavano, skutecne))
    {
        throw new Exception(zprava ?? "Objekty nejsou stejné.");
    }
}

PSDNET-1608. TextBound nefunguje tak, jak se očekává

string sourceFile = "vstup_ZkouskaNaVstupenku.psd";
string outFile = "out_1608.psd";

Size novaTextBox = new Size(-1, -1);
using (PsdImage psdImage = (PsdImage)Aspose.PSD.Image.Load(sourceFile))
{
    //Krok: Nahrazení textu
    TextLayer textovaVrstva = (TextLayer)psdImage.Layers[3];
    textovaVrstva.TextData.Items[0].Text = "Test text nahrazen";

    //Krok: Aktualizace TextBoundBox
    textovaVrstva.TextData.UpdateLayerData();
    novaTextBox = new Size((int)Math.Ceiling(textovaVrstva.TextBoundBox.Width), text