Aspose.PSD pro .NET 21.11 - Poznámky k vydání

Klíč Shrnutí Kategorie
PSDNET-767 Výjimka při přidávání existující textové vrstvy do skupiny vrstev Chyba
PSDNET-988 IndexOutOfRangeException při aktualizaci textové vrstvy Chyba
PSDNET-989 Exportované tvary mají špatné souřadnice ve výsledném souboru Chyba
PSDNET-1002 Nesprávný export vektorového tvaru při exportu složky Chyba

Změny ve veřejném API

Přidaná API:

  • Žádné

Odebrané API:

  • Žádné

Příklady použití:

PSDNET-767. Výjimka při přidávání existující textové vrstvy do skupiny vrstev

            string outputPsd = "out_dummy_group.psd";

            var psdOptions = new PsdOptions()
            {
                Source = new StreamSource(new MemoryStream(), true),
                ColorMode = ColorModes.Rgb,
                ChannelsCount = 4,
                ChannelBitsCount = 8,
                CompressionMethod = CompressionMethod.RLE
            };
            using (PsdImage image = (PsdImage)Image.Create(psdOptions, 10, 15))
            {
                var group = image.AddLayerGroup("TestGroup", 0, true);
                var layer = image.AddTextLayer("Text", Rectangle.FromLeftTopRightBottom(-2, 3, 14, 17));
                group.AddLayer(layer);

                image.Save(outputPsd);
            }

PSDNET-988. IndexOutOfRangeException při aktualizaci textové vrstvy

            string srcFile = "M1TTTT16062021001.psd";
            string fontsFolder = "Fonts";
            string outputPng = "out_M1TTTT16062021001.png";

            FontSettings.SetFontsFolder(fontsFolder);
            FontSettings.UpdateFonts();

            string[] words = new[] { "Mom", "Stacy" };
            string[] fonts = new[] { "Caveat", "Gochi Hand", "Lobster", "Satisfy" };

            using (var image = (PsdImage)Image.Load(srcFile))
            {
                foreach (var layer in image.Layers)
                {
                    var txtLayer = layer as TextLayer;
                    if (txtLayer != null)
                    {
                        for (int w = 0; w < words.Length; w++)
                        {
                            for (int f = 0; f < fonts.Length; f++)
                            {
                                txtLayer.UpdateText(words[w]);
                                foreach (var txtItem in txtLayer.TextData.Items)
                                {
                                    txtItem.Style.FontName = FontSettings.GetAdobeFontName(fonts[f]);
                                }

                                txtLayer.TextData.UpdateLayerData();
                            }
                        }
                    }
                }

                image.Save(outputPng, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
            }

PSDNET-989. Exportované tvary mají špatné souřadnice ve výsledném souboru

        public void CreatingVectorPathExample()
        {
            string outputPsd = "outputPsd.psd";

            using (var psdImage = (PsdImage)Image.Create(new PsdOptions() { Source = new Sources.StreamSource(new MemoryStream()), }, 500, 500))
            {
                FillLayer layer = FillLayer.CreateInstance(PSD.FileFormats.Psd.Layers.FillSettings.FillType.Color);
                psdImage.AddLayer(layer);

                VectorPath vectorPath = VectorDataProvider.CreateVectorPathForLayer(layer);
                vectorPath.FillColor = Color.IndianRed;
                PathShape shape = new PathShape();
                shape.Points.Add(new BezierKnot(new PointF(50, 150), true));
                shape.Points.Add(new BezierKnot(new PointF(100, 200), true));
                shape.Points.Add(new BezierKnot(new PointF(0, 200), true));
                vectorPath.Shapes.Add(shape);
                VectorDataProvider.UpdateLayerFromVectorPath(layer, vectorPath, true);

                psdImage.Save(outputPsd);
            }
        }


    #region Editor vektorové cesty (Zde jsou umístěny třídy pro úpravy vektorových cest).

    /// <summary>
    /// Třída, která poskytuje práci mezi vrstvou <see cref="Layer"/> a <see cref="VectorPath"/>.
    /// </summary>
    public static class VectorDataProvider
    {
        /// <summary>
        /// Vytvoří instanci <see cref="VectorPath"/> na základě prostředků z vstupní vrstvy.
        /// </summary>
        /// <param name="psdLayer">Vrstva PSD.</param>
        /// <returns>Instance <see cref="VectorPath"/> na základě prostředků z vstupní vrstvy.</returns>
        public static VectorPath CreateVectorPathForLayer(Layer psdLayer)
        {
            ValidateLayer(psdLayer);

            Size imageSize = psdLayer.Container.Size;

            VectorPathDataResource pathResource = FindVectorPathDataResource(psdLayer, true);
            SoCoResource socoResource = FindSoCoResource(psdLayer, true);
            VectorPath vectorPath = new VectorPath(pathResource, imageSize);
            if (socoResource != null)
            {
                vectorPath.FillColor = socoResource.Color;
            }

            return vectorPath;
        }

        /// <summary>
        /// Aktualizuje prostředky vstupní vrstvy z instance <see cref="VectorPath"/> nebo nahradí novým zdrojem cesty a aktualizuje.
        /// </summary>
        /// <param name="psdLayer">Vrstva PSD.</param>
        /// <param name="vectorPath">Vektorová cesta.</param>
        /// <param name="imageSize">Velikost obrázku pro správné korekce souřadnic bodů.</param>
        public static void UpdateLayerFromVectorPath(Layer psdLayer, VectorPath vectorPath, bool createIfNotExist = false)
        {
            ValidateLayer(psdLayer);

            VectorPathDataResource pathResource = FindVectorPathDataResource(psdLayer, createIfNotExist);
            VogkResource vogkResource = FindVogkResource(psdLayer, createIfNotExist);
            SoCoResource socoResource = FindSoCoResource(psdLayer, createIfNotExist);

            Size imageSize = psdLayer.Container.Size;
            UpdateResources(pathResource, vogkResource, socoResource, vectorPath, imageSize);

            ReplaceVectorPathDataResourceInLayer(psdLayer, pathResource, vogkResource, socoResource);
        }

        // Zde jsou další metody třídy VectorDataProvider

        /// <summary>
        /// Odebere data vektorové cesty z vstupní vrstvy.
        /// </summary>
        /// <param name="psdLayer">Vrstva PSD.</param>
        public static void RemoveVectorPathDataFromLayer(Layer psdLayer)
        {
            // ...
        }

        // Další metody třídy VectorDataProvider

        /// <summary>
        /// Aktualizuje zdroje dat z instance <see cref="VectorPath"/>.
        /// </summary>
        /// <param name="pathResource">Prostředek cesty.</param>
        /// <param name="vogkResource">Prostředek původu vektorových dat.</param>
        /// <param name="socoResource">Prostředek jednotné barvy.</param>
        /// <param name="vectorPath">Vektorová cesta.</param>
        /// <param name="imageSize">Velikost obrázku pro správné korekce souřadnic bodů.</param>
        private static void UpdateResources(VectorPathDataResource pathResource, VogkResource vogkResource, SoCoResource socoResource, VectorPath vectorPath, Size imageSize)
        {
            // Metoda pro aktualizaci prostředků
        }

        // Další metody třídy VectorDataProvider

        /// <summary>
        /// Najde prostředek <see cref="VectorPathDataResource"/> v zdrojích vstupní vrstvy.
        /// </summary>
        /// <param name="psdLayer">Vrstva PSD.</param>
        /// <param name="createIfNotExist">Pokud prostředek neexistuje, pro hodnotu <see cref="true"/> vytvoří nový prostředek, jinak vrátí <see cref="null"/>.</param>
        /// <returns>Prostředek <see cref="VectorPathDataResource"/>.</returns>
        private static VectorPathDataResource FindVectorPathDataResource(Layer psdLayer, bool createIfNotExist = false)
        {
            // ...
        }

        // Další metody třídy VectorDataProvider
    }

    // Další třídy a metody

PSDNET-1002. Nesprávný export vektorového tvaru při exportu složky

            string srcFile = "psdnet1002.psd";
            string outputPng = "output.png";

            using (var image = (PsdImage)Image.Load(srcFile))
            {
                image.Layers[4].Save(outputPng, new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
            }