Aspose.PSD для .NET 18.8 - Примечания к выпуску

Ключ Описание Категория
PSDNET-68 Поддержка свойства LayerCreationDateTime. Функционал
PSDNET-67 Поддержка выделения Цвета Листа Функционал
PSDNET-66 Возможность объединения слоев один с другим Функционал
PSDNET-65 Добавление частичной поддержки свойства Предел Слоя Текста Функционал
PSDNET-64 Добавление поддержки IopaResource Функционал
PSDNET-56 Поддержка эффектов слоев для формата PSD Функционал
PSDNET-55 Поддержка InterruptMonitor для .Net Функционал
PSDNET-50 Возможность объединения слоев Функционал
PSDNET-49 Добавление рендеринга свойства непрозрачности заполнения в слоях. Функционал
PSDNET-43 Реализация рендеринга Слоя Коррекции Кривых Функционал
PSDNET-42 Добавление поддержки Слоя Коррекции Кривых Функционал
PSDNET-41 Реализация рендеринга Слоя Коррекции Уровней Функционал
PSDNET-40 Добавление поддержки Слоя Коррекции Уровней Функционал
PSDNET-37 Добавление поддержки Слоя Коррекции Канала Микшера Функционал
PSDNET-35 Добавление поддержки Слоя Коррекции Оттенка/Насыщенности Функционал
PSDNET-34 Реализация рендеринга Слоя Коррекции Экспозиции для экспорта. Функционал
PSDNET-31 Добавление поддержки рендеринга для экспорта слоя коррекции канала микшера Функционал
PSDNET-26 Добавление поддержки маскирования Функционал
PSDNET-13 Добавить поддержку маски слоя Функционал
PSDNET-9 Добавление поддержки Слоя Коррекции Фотофильтра Функционал
PSDNET-8 Добавление поддержки слоя коррекции канала микшера Функционал
PSDNET-7 Добавление поддержки слоя коррекции экспозиции Функционал
PSDNET-6 Добавление поддержки слоя коррекции яркости/контрастности Функционал
PSDNET-5 Добавить частичную поддержку слоев коррекции Функционал
PSDNET-3 Добавление поддержки опции текста PSD без переноса Функционал
PSDNET-2 Возможность добавления текстового слоя на лету Функционал
PSDNET-62 Кодек TIFF не может сохранить изображение канала 16 бит Улучшение
PSDNET-61 Сохранение изображения PSD приводит к неверным цветам изображения Улучшение
PSDNET-60 Некорректно указано местоположение левого верхнего угла при обновлении Улучшение
PSDNET-59 Исключение при обновлении текстовых слоев Улучшение
PSDNET-58 Отображение свойства Codec для изображения JPEG2000 Улучшение
PSDNET-57 Исправление настроек 24bpp для экспорта в BMP Улучшение
PSDNET-46 Слой коррекции не учитывается при конвертации CMYK PSD в TIFF или JPG Улучшение

Примеры использования:

PSDNET-68 Поддержка свойства LayerCreationDateTime

 // Пример свойства LayerCreationDateTime

Строка sourceFileName = "OneLayer.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var layer = im.Layers[0];

    var creationDateTime = layer.LayerCreationDateTime;

    var expectedDateTime = new DateTime(2018, 7, 17, 8, 57, 24, 769);

    Assert.AreEqual(expectedDateTime, creationDateTime);

    var now = DateTime.Now;

    var createdLayer = im.AddLevelsAdjustmentLayer();

    // Проверка, что дата создания обновлена на вновь созданных слоях

    Assert.True(now <= createdLayer.LayerCreationDateTime);

}

PSDNET-67 Поддержка выделения цвета Листа

 // Пример использования свойства SheetColorHighlight

Строка sourceFileName = "SheetColorHighlightExample.psd";

Строка exportPath = "SheetColorHighlightExampleChanged.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var layer1 = im.Layers[0];

    Assert.AreEqual(SheetColorHighlightEnum.Violet, layer1.SheetColorHighlight);

    var layer2 = im.Layers[1];

    Assert.AreEqual(SheetColorHighlightEnum.Orange, layer2.SheetColorHighlight);



    layer1.SheetColorHighlight = SheetColorHighlightEnum.Yellow;



    im.Save(exportPath);	

}

PSDNET-66 Возможность объединения слоев один с другим

 // Пример слияния двух слоев

Строка sourceFile1 = "FillOpacitySample.psd";

Строка sourceFile2 = "ThreeRegularLayersSemiTransparent.psd";

Строка exportPath = "MergedLayersFromTwoDifferentPsd.psd" 

используя (var im1 = (PsdImage)(Image.Load(sourceFile1)))

{

    var layer1 = im1.Layers[1];

    используя (var im2 = (PsdImage)(Image.Load(sourceFile2)))

    {

        var layer2 = im2.Layers[0];

        layer1.MergeLayerTo(layer2);

	im2.Save(exportPath);	

    }

}

PSDNET-65 Добавление частичной поддержки свойства Предел Слоя Текста

 // Пример Text BoxBounds

Строка sourceFileName = "LayerWithText.psd";

var correctOpticalSize = new Size(127, 45);

var correctBoundBox = new Size(172, 62);

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var textLayer = (TextLayer)im.Layers[1];

    // Размер слоя - это размер области рендеринга

    var opticalSize = textLayer.Size;

    Assert.AreEqual(correctOpticalSize, opticalSize);

    // TextBoundBox - максимальный размер слоя для слоя текста

    // В этой области PS попытается вписать ваш текст

    var boundBox = textLayer.TextBoundBox;

    Assert.AreEqual(correctBoundBox, boundBox);

}

PSDNET-64 Добавление поддержки IopaResource

 // Изменение свойства непрозрачности заполнения через изменение IopaResource

Строка sourceFileName = "FillOpacitySample.psd";

Строка exportPath = "FillOpacitySampleChanged.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var layer = im.Layers[2];



    var resources = layer.Resources;

    foreach (var resource in resources)

    {

        if (resource is IopaResource)

        {

            var iopaResource = (IopaResource)resource;

            iopaResource.FillOpacity = 200;

        }

    }



    im.Save(exportPath);	

}

PSDNET-56 Поддержка эффектов слоев для формата PSD

 используя (

    PsdImage image =



        (PsdImage)

        Aspose.PSD.Image.Load(



            sourceFileName,



            новые Aspose.PSD.ImageLoadOptions.PsdLoadOptions()

            {

                LoadEffectsResource = true,

                UseDiskForLoadEffectsResource = true

            }))

{

    image.Save(

                output,



                новые Aspose.PSD.ImageOptions.PngOptions()

                {

                    ColorType =

                            Aspose.PSD.FileFormats.Png

                            .PngColorType

                            .TruecolorWithAlpha

                });

}

PSDNET-55 Поддержка InterruptMonitor для .Net

         публичный void InterruptMonitorTest(string dir, string ouputDir)

        {

            ImageOptionsBase saveOptions = новые ImageOptions.PngOptions();

            Multithreading.InterruptMonitor monitor = новый Multithreading.InterruptMonitor();

            SaveImageWorker worker = новый SaveImageWorker(dir + "big.psb", dir + "big_out.png", saveOptions, monitor);

            System.Threading.Thread thread = новый System.Threading.Thread(новый System.Threading.ThreadStart(worker.ThreadProc));

            попробовать

            {

                thread.Start();

                // Тайм-аут должен быть меньше времени, необходимого для полного преобразования изображения (без прерывания).

                System.Threading.Thread.Sleep(3000);

                // Прерывание процесса

                monitor.Interrupt();

                System.Console.WriteLine("Прерывание потока сохранения #{0} в {1}", thread.ManagedThreadId, System.DateTime.Now);

                // Ожидание прерывания...

                thread.Join();

            }

            finally

            {

                // Если файл, который должен быть удален, не существует, исключение не генерируется.

                System.IO.File.Delete(dir + "big_out.png");

            }

        }

        /// <summary>

        /// Инициирует преобразование изображения и ожидает его прерывание.

        /// </summary>

        private class SaveImageWorker

        {

            /// <summary>

            /// Путь к исходному изображению.

            /// </summary>

            private readonly string inputPath;

            /// <summary>

            /// Путь к выходному изображению.

            /// </summary>

            private readonly string outputPath;

            /// <summary>

            /// Монитор прерывания.

            /// </summary>

            private readonly Multithreading.InterruptMonitor monitor;

            /// <summary>

            /// Опции сохранения.

            /// </summary>

            private readonly ImageOptionsBase saveOptions;

            /// <summary>

            /// Инициализирует новый экземпляр класса <see cref="SaveImageWorker" />.

            /// </summary>

            /// <param name="inputPath">Путь к исходному изображению.</param>

            /// <param name="outputPath">Путь к выходному изображению.</param>

            /// <param name="saveOptions">Опции сохранения.</param>

            /// <param name="monitor">Монитор прерывания.</param>

            публичный SaveImageWorker(string inputPath, string outputPath, ImageOptionsBase saveOptions, Multithreading.InterruptMonitor monitor)

            {

                this.inputPath = inputPath;

                this.outputPath = outputPath;

                this.saveOptions = saveOptions;

                this.monitor = monitor;

            }

            /// <summary>

            /// Пытается конвертировать изображение из одного формата в другой. Обрабатывает прерывание. 

            /// </summary>

            публичный void ThreadProc()

            {

                используя (Image image = Image.Load(this.inputPath))

                {

                    Multithreading.InterruptMonitor.ThreadLocalInstance = this.monitor;

                    попробовать

                    {

                        image.Save(this.outputPath, this.saveOptions);

                        Assert.Fail("Ожидаемое прерывание.");

                    }

                    поймать (CoreExceptions.OperationInterruptedException e)

                    {

                        System.Console.WriteLine("Поток сохранения #{0} завершается в {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, System.DateTime.Now);

                        System.Console.WriteLine(e);

                    }

                    поймать (System.Exception e)

                    {

                        System.Console.WriteLine(e);

                    }

                    наконец

                    {

                        Multithreading.InterruptMonitor.ThreadLocalInstance = null;

                    }

                }

            }

        }

PSDNET-50 Создание возможности слияния слоев

 // Объединить весь PSD

Строка sourceFileName = "ThreeRegularLayersSemiTransparent.psd";

Строка exportPath = "ThreeRegularLayersSemiTransparentFlattened.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    im.FlattenImage();

    im.Save(exportPath);	 

}

// Объединить один слой с другим

Строка sourceFileName = "ThreeRegularLayersSemiTransparent.psd";

Строка exportPath = "ThreeRegularLayersSemiTransparentFlattenedLayerByLayer.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var bottomLayer = im.Layers[0];

    var middleLayer = im.Layers[1];

    var topLayer = im.Layers[2];

    var layer1 = im.MergeLayers(bottomLayer, middleLayer);

    var layer2 = im.MergeLayers(layer1, topLayer);

    // Настройка объединенных слоев

    im.Layers = новые Layer[] { layer2 };



    im.Save(exportPath);	 

}

PSDNET-49 Добавление рендеринга свойства непрозрачности заполнения в слоях

 // Изменение свойства непрозрачности заполнения

Строка sourceFileName = "FillOpacitySample.psd";

Строка exportPath = "FillOpacitySampleChanged.psd";

используя (var im = (PsdImage)(Image.Load(sourceFileName)))

{

    var layer = im.Layers[2];

    layer.FillOpacity = 5;

    im.Save(exportPath);	

}

PSDNET-43 Реализация рендеринга Слоя Коррекции Кривых

 // Редактирование слоя кривых

Строка sourceFileName = "CurvesAdjustmentLayer";

Строка psdPathAfterChange = "CurvesAdjustmentLayerChanged";

Строка pngExportPath = "CurvesAdjustmentLayerChanged";

для (int j = 1; j < 2; j++)

{

    используя (var im = LoadFile(sourceFileName + j.ToString() + ".psd"))

    {

        для каждого (var layer в im.Layers)

	{

            if (layer is CurvesLayer)

            {

                 var curvesLayer = (CurvesLayer)layer;

                 if (curvesLayer.IsDiscreteManagerUsed)

                 {

                      var manager = (CurvesDiscreteManager)curvesLayer.GetCurvesManager();

                      для (int i = 10; i < 50; i++)

                      {

                           manager.SetValueInPosition(0, (byte)i, (byte)(15 + (i * 2)));

                      }

                 }

                 еще

                 {

                      var manager = (CurvesContinuousManager)curvesLayer.GetCurvesManager();

                      manager.AddCurvePoint(0, 50, 100);

                      manager.AddCurvePoint(0, 150, 130);

                 }

            }

        }

    }



    // Сохранить PSD

    im.Save(psdPathAfterChange + j.ToString() + ".psd");
	


    // Сохранить PNG

    var saveOptions = новые PngOptions();

    saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

    im.Save(pngExportPath + j.ToString() + ".png", saveOptions);

}

PSDNET-42 Добавление поддержки Слоя Коррекции Кривых

 // Редактирование слоя кривых

Строка sourceFileName = "CurvesAdjustmentLayer";

Строка psdPathAfterChange = "CurvesAdjustmentLayerChanged";

для (int j = 1; j < 2; j++)

{

    используя (var im = LoadFile(sourceFileName + j.ToString() + ".psd"))

    {

         для каждого (var layer в im.Layers)

	 {

            if (layer is CurvesLayer            {

                 var curvesLayer = (CurvesLayer)layer;

                 if (curvesLayer.IsDiscreteManagerUsed)

                 {

                      var manager = (CurvesDiscreteManager)curvesLayer.GetCurvesManager();

                      for (int i = 10; i < 50; i++)

                      {

                           manager.SetValueInPosition(0, (byte)i, (byte)(15 + (i * 2)));

                      }

                 }

                 else

                 {

                      var manager = (CurvesContinuousManager)curvesLayer.GetCurvesManager();

                      manager.AddCurvePoint(0, 50, 100);

                      manager.AddCurvePoint(0, 150, 130);

                 }

            }

	}

    }



    // Сохранить PSD

    im.Save(psdPathAfterChange + j.ToString() + ".psd");

}

PSDNET-41 Реализация рендеринга Слоя Коррекции Уровней

 // Редактирование слоя уровней

Строка sourceFileName = "LevelsAdjustmentLayer.psd";

Строка psdPathAfterChange = "LevelsAdjustmentLayerChanged.psd";

Строка pngExportPath = "LevelsAdjustmentLayerChanged.png";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

        если (layer is LevelsLayer)

        {

            var levelsLayer = (LevelsLayer)layer;

            var channel = levelsLayer.GetChannel(0);

            channel.InputMidtoneLevel = 2.0f;

            channel.InputShadowLevel = 10;

            channel.InputHighlightLevel = 230;

            channel.OutputShadowLevel = 20;

            channel.OutputHighlightLevel = 200;

        }

    }



    // Сохранить PSD

    im.Save(psdPathAfterChange);



    // Сохранить PNG

    var saveOptions = новые PngOptions();

    saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

    im.Save(pngExportPath, saveOptions);

}

PSDNET-40 Добавление поддержки Слоя Коррекции Уровней

 // Редактирование слоя уровней

Строка sourceFileName = "LevelsAdjustmentLayer.psd";

Строка psdPathAfterChange = "LevelsAdjustmentLayerChanged.psd";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

        если (layer is LevelsLayer)

        {

            var levelsLayer = (LevelsLayer)layer;

            var channel = levelsLayer.GetChannel(0);

            channel.InputMidtoneLevel = 2.0f;

            channel.InputShadowLevel = 10;

            channel.InputHighlightLevel = 230;

            channel.OutputShadowLevel = 20;

            channel.OutputHighlightLevel = 200;

        }

    }



    // Сохранить PSD

    im.Save(psdPathAfterChange);

}

PSDNET-37 Добавление поддержки Слоя Коррекции Канала Миксера

// Rgb Канал Миксера

Строка sourceFileName = "ChannelMixerAdjustmentLayerRgb.psd";

Строка psdPathAfterChange = "ChannelMixerAdjustmentLayerRgbChanged.psd";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

         если (layer is RgbChannelMixerLayer)

         {

              var rgbLayer = (RgbChannelMixerLayer)layer;

              rgbLayer.RedChannel.Blue = 100;

              rgbLayer.BlueChannel.Green = -100;

              rgbLayer.GreenChannel.Constant = 50;

         }

    }



    im.Save(psdPathAfterChange);

}

// Cmyk Канал Миксера

Строка sourceFileName = "ChannelMixerAdjustmentLayerCmyk.psd";

Строка psdPathAfterChange = "ChannelMixerAdjustmentLayerCmykChanged.psd";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

         если (layer is CmykChannelMixerLayer)

         {

             var cmykLayer = (CmykChannelMixerLayer)layer;

             cmykLayer.CyanChannel.Black = 20;

             cmykLayer.MagentaChannel.Yellow = 50;

             cmykLayer.YellowChannel.Cyan = -25;

             cmykLayer.BlackChannel.Yellow = 25;

         }

    }



    im.Save(psdPathAfterChange);

}





// Добавление нового слоя(Cmyk для этого примера)

Строка sourceFileName = "CmykWithAlpha.psd";

Строка psdPathAfterChange = "ChannelMixerAdjustmentLayerCmykChanged.psd";

используя (var im = LoadFile(sourceFileName))

{

    var newlayer = im.AddChannelMixerAdjustmentLayer();

    newlayer.GetChannelByIndex(2).Constant = 50;

    newlayer.GetChannelByIndex(0).Constant = 50;



    im.Save(psdPathAfterChange);

}		

PSDNET-35 Добавление поддержки Слоя Коррекции Оттенка/Насыщенности

 // Редактирование слоя оттенка/насыщенности

Строка sourceFileName = "HueSaturationAdjustmentLayer.psd";

Строка psdPathAfterChange = "HueSaturationAdjustmentLayerChanged.psd";

используя (var im = LoadFile(sourceFileName))

{

     для каждого (var layer в im.Layers)

     {

           если (layer is HueSaturationLayer)

           {

                var hueLayer = (HueSaturationLayer)layer;

                hueLayer.Hue = -25;

                hueLayer.Saturation = -12;

                hueLayer.Lightness = 67;

                var colorRange = hueLayer.GetRange(2);

                colorRange.Hue = -40;

                colorRange.Saturation = 50;

                colorRange.Lightness = -20;

                colorRange.MostLeftBorder = 300;

           }

      }

      im.Save(psdPathAfterChange);

}



// Добавление слоя оттенка/насыщенности

Строка sourceFileName = "PhotoExample.psd";

Строка psdPathAfterChange = "PhotoExampleAddedHueSaturation.psd";



используя (PsdImage im = LoadFile(sourceFileName))

{

     this.SaveForVisualTest(im, this.OutputPath, prefix + file, "before");

     var hueLayer = im.AddHueSaturationAdjustmentLayer();

     hueLayer.Hue = -25;

     hueLayer.Saturation = -12;

     hueLayer.Lightness = 67;

     var colorRange = hueLayer.GetRange(2);

     colorRange.Hue = -160;

     colorRange.Saturation = 100;

     colorRange.Lightness = 20;

     colorRange.MostLeftBorder = 300;



     im.Save(psdPathAfterChange);

}

PSDNET-34 Реализация рендеринга Слоя Коррекции Экспозиции для экспорта.

 // Редактирование слоя экспозиции

Строка sourceFileName = "ExposureAdjustmentLayer.psd";

Строка psdPathAfterChange = "ExposureAdjustmentLayerChanged.psd";

Строка pngExportPath = "ExposureAdjustmentLayerChanged.png";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

        если (layer is ExposureLayer)

        {

	    var expLayer = (ExposureLayer)layer;

            expLayer.Exposure = 2;

            expLayer.Offset = -0.25f;

            expLayer.GammaCorrection = 0.5f;

        }

    }



    // Сохранить PSD

    im.Save(psdPathAfterChange);



    // Сохранить PNG

    var saveOptions = новые PngOptions();

    saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

    im.Save(pngExportPath, saveOptions);

}



// Добавление слоя экспозиции

Строка sourceFileName = "PhotoExample.psd";

Строка psdPathAfterChange = "PhotoExampleAddedExposure.psd";

Строка pngExportPath = "PhotoExampleAddedExposure.png";

используя (PsdImage im = LoadFile(sourceFileName))

{

     var newlayer = im.AddExposureAdjustmentLayer();

     newlayer.Exposure = 2;

     newlayer.Offset = -0.25f;

     newlayer.GammaCorrection = 2f;



     // Сохранить PSD

     im.Save(psdPathAfterChange);



     // Сохранить PNG

     var saveOptions = новые PngOptions();

     saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

     im.Save(pngExportPath, saveOptions);

}

PSDNET-31 Добавление поддержки рендеринга для экспорта слоя коррекции канала микшера

// Rgb Канал Миксера

Строка sourceFileName = "ChannelMixerAdjustmentLayerRgb.psd";

Строка psdPathAfterChange = "ChannelMixerAdjustmentLayerRgbChanged.psd";

Строка pngExportPath = "ChannelMixerAdjustmentLayerRgbChanged.png";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

         если (layer is RgbChannelMixerLayer)

         {

              var rgbLayer = (RgbChannelMixerLayer)layer;

              rgbLayer.RedChannel.Blue = 100;

              rgbLayer.BlueChannel.Green = -100;

              rgbLayer.GreenChannel.Constant = 50;

         }

    }



	// Сохранить PSD

    im.Save(psdPathAfterChange);



	// Сохранить PNG

    var saveOptions = новые PngOptions();

    saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

    im.Save(pngExportPath, saveOptions);

}

// Cmyk Канал Миксера

Строка sourceFileName = "ChannelMixerAdjustmentLayerCmyk.psd";

Строка psdPathAfterChange = "ChannelMixerAdjustmentLayerCmykChanged.psd";

Строка pngExportPath = "ChannelMixerAdjustmentLayerCmykChanged.png";

используя (var im = LoadFile(sourceFileName))

{

    для каждого (var layer в im.Layers)

    {

         если (layer is CmykChannelMixerLayer)

         {

             var cmykLayer = (CmykChannelMixerLayer)layer;

             cmykLayer.CyanChannel.Black = 20;

             cmykLayer.MagentaChannel.Yellow = 50;

             cmykLayer.YellowChannel.Cyan = -25;

             cmykLayer.BlackChannel.Yellow = 25;

         }

    }



	// Сохранить PSD

    im.Save(psdPathAfterChange);



	// Сохранить PNG

    var saveOptions = новые PngOptions();

    saveOptions.ColorType = PngColorType.TruecolorWithAlpha;

    im.Save(pngExportPath, saveOptions);

}