Catatan Rilis Aspose.PSD untuk .NET 18.8
Kunci | Ringkasan | Kategori |
---|---|---|
PSDNET-68 | Dukungan untuk properti LayerCreationDateTime. | Fitur |
PSDNET-67 | Dukungan untuk Highlighting Warna SheetColor | Fitur |
PSDNET-66 | Kemampuan untuk menggabungkan layer satu dengan yang lain | Fitur |
PSDNET-65 | Menambahkan dukungan parsial properti BoundBox Layer Teks | Fitur |
PSDNET-64 | Menambahkan dukungan untuk IopaResource | Fitur |
PSDNET-56 | Dukungan untuk Efek Layer untuk format PSD | Fitur |
PSDNET-55 | Dukungan Monitor Interupsi untuk .Net | Fitur |
PSDNET-50 | Membuat kemungkinan meratakan layer | Fitur |
PSDNET-49 | Menambahkan pengaturan opasitas pengisian dalam layer. | Fitur |
PSDNET-43 | Menerapkan rendering dari Kurva Penyesuaian Layer | Fitur |
PSDNET-42 | Menambahkan dukungan dari Kurva Penyesuaian Layer | Fitur |
PSDNET-41 | Menerapkan rendering dari Layer Penyesuaian Level | Fitur |
PSDNET-40 | Menambahkan dukungan dari Layer penyesuaian Level | Fitur |
PSDNET-37 | Menambahkan dukungan dari Layer Penyesuaian Mixer Saluran | Fitur |
PSDNET-35 | Menambahkan dukungan dari Layer Penyesuaian Hue/Saturasi | Fitur |
PSDNET-34 | Menerapkan rendering dari Layer Penyesuaian Paparan untuk ekspor. | Fitur |
PSDNET-31 | Menambahkan dukungan untuk eksport dari ChannelMixer adjustment layer | Fitur |
PSDNET-26 | Menambahkan dukungan dari masker Pengguntingan | Fitur |
PSDNET-13 | Menambahkan dukungan dari layer mask | Fitur |
PSDNET-9 | Menambahkan dukungan dari layer penyesuaian Filter Foto | Fitur |
PSDNET-8 | Menambahkan dukungan dari layer penyesuaian Channel Mixer | Fitur |
PSDNET-7 | Menambahkan dukungan dari layer penyesuaian Paparan | Fitur |
PSDNET-6 | Menambahkan dukungan dari layer penyesuaian Kecerahan/Kontras | Fitur |
PSDNET-5 | Menambahkan dukungan parsial dari layers penyesuaian | Fitur |
PSDNET-3 | Menambahkan dukungan untuk opsi teks PSD NoBreak | Fitur |
PSDNET-2 | Kemampuan untuk menambahkan Layer Teks saat runtime | Fitur |
PSDNET-62 | Codec TIFF tidak dapat menyimpan gambar kanal 16-bit | Peningkatan |
PSDNET-61 | Menyimpan gambar PSD menghasilkan warna gambar yang tidak valid | Peningkatan |
PSDNET-60 | Koordinat sudut kiri atas tidak benar pada pembaruan | Peningkatan |
PSDNET-59 | Exception saat memperbarui layer teks | Peningkatan |
PSDNET-58 | Expose Properti Codec dari gambar JPEG2000 ke publik | Peningkatan |
PSDNET-57 | Memperbaiki opsi 24bpp untuk ekspor ke BMP | Peningkatan |
PSDNET-46 | Layer penyesuaian diabaikan untuk konversi PSD CMYK ke TIFF atau JPG | Peningkatan |
Contoh Penggunaan:
PSDNET-68 Dukungan untuk properti LayerCreationDateTime
// Contoh penggunaan properti LayerCreationDateTime
string sourceFileName = "SatuLayer.psd";
using (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();
// Periksa apakah Tanggal Pembuatan Telah Diperbarui pada layer yang baru dibuat
Assert.True(now <= createdLayer.LayerCreationDateTime);
}
PSDNET-67 Dukungan untuk Highlighting Warna SheetColor
// Contoh penggunaan properti SheetColorHighlight
string sourceFileName = "ContohSheetColorHighlight.psd";
string exportPath = "SheetColorHighlightExampleChanged.psd";
using (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 Kemampuan untuk menggabungkan layer satu ke layer lain
// Contoh penggabungan dua layer
var sourceFile1 = "ContohPengisianOpasitas.psd";
var sourceFile2 = "TigaLayerBiasaSemiTransparan.psd";
var exportPath = "LayerBergabungDariDuaPsdBerbeda.psd"
using (var im1 = (PsdImage)(Image.Load(sourceFile1)))
{
var layer1 = im1.Layers[1];
using (var im2 = (PsdImage)(Image.Load(sourceFile2)))
{
var layer2 = im2.Layers[0];
layer1.MergeLayerTo(layer2);
im2.Save(exportPath);
}
}
PSDNET-65 Menambahkan dukungan parsial dari properti BoundBox Layer Teks
// Contoh BoundBox TextLayer
string sourceFileName = "LayerDenganTeks.psd";
var correctOpticalSize = new Size(127, 45);
var correctBoundBox = new Size(172, 62);
using (var im = (PsdImage)(Image.Load(sourceFileName)))
{
var textLayer = (TextLayer)im.Layers[1];
// Ukuran layer adalah ukuran area yang dirender
var opticalSize = textLayer.Size;
Assert.AreEqual(correctOpticalSize, opticalSize);
// TextBoundBox adalah ukuran maksimum layer untuk Text Layer.
// Di dalam area ini PS akan mencoba mencocokkan teks Anda
var boundBox = textLayer.TextBoundBox;
Assert.AreEqual(correctBoundBox, boundBox);
}
PSDNET-64 Menambahkan dukungan untuk IopaResource
// Mengubah properti Opasitas Pengisian melalui perubahan IopaResource
string sourceFileName = "ContohPengisianOpasitas.psd";
string exportPath = "ContohPengisianOpasitasBerubah.psd";
using (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 Dukungan Efek Layer untuk format PSD
using (
PsdImage image =
(PsdImage)
Aspose.PSD.Image.Load(
sourceFileName,
new Aspose.PSD.ImageLoadOptions.PsdLoadOptions()
{
LoadEffectsResource = true,
UseDiskForLoadEffectsResource = true
}))
{
image.Save(
output,
new Aspose.PSD.ImageOptions.PngOptions()
{
ColorType =
Aspose.PSD.FileFormats.Png
.PngColorType
.TruecolorWithAlpha
});
}
PSDNET-55 Dukungan Monitor Interupsi untuk .Net
public void UjiMonitorInterupsi(string dir, string ouputDir)
{
ImageOptionsBase saveOptions = new ImageOptions.PngOptions();
Multithreading.InterruptMonitor monitor = new Multithreading.InterruptMonitor();
SaveImageWorker worker = new SaveImageWorker(dir + "besar.psb", dir + "besar_out.png", saveOptions, monitor);
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(worker.ThreadProc));
try
{
thread.Start();
// Batas waktu harus kurang dari waktu yang dibutuhkan untuk konversi gambar lengkap (tanpa interupsi).
System.Threading.Thread.Sleep(3000);
// Interupsi proses
monitor.Interrupt();
System.Console.WriteLine("Menginterupsi thread simpan #{0} di {1}", thread.ManagedThreadId, System.DateTime.Now);
// Tunggu untuk interupsi...
thread.Join();
}
finally
{
// Jika file yang akan dihapus tidak ada, tidak ada pengecualian yang dilemparkan.
System.IO.File.Delete(dir + "besar_out.png");
}
}
/// <summary>
/// Memulai konversi gambar dan menunggu interupsinya.
/// </summary>
private class SaveImageWorker
{
/// <summary>
/// Path ke gambar masukan.
/// </summary>
private readonly string inputPath;
/// <summary>
/// Path ke gambar keluaran.
/// </summary>
private readonly string outputPath;
/// <summary>
/// Monitor interupsi.
/// </summary>
private readonly Multithreading.InterruptMonitor monitor;
/// <summary>
/// Opsi penyimpanan.
/// </summary>
private readonly ImageOptionsBase saveOptions;
/// <summary>
/// Inisialisasi instance baru dari kelas SaveImageWorker.
/// </summary>
/// <param name="inputPath">Path ke gambar masukan.</param>
/// <param name="outputPath">Path ke gambar keluaran.</param>
/// <param name="saveOptions">Opsi penyimpanan.</param>
/// <param name="monitor">Monitor interupsi.</param>
public SaveImageWorker(string inputPath, string outputPath, ImageOptionsBase saveOptions, Multithreading.InterruptMonitor monitor)
{
this.inputPath = inputPath;
this.outputPath = outputPath;
this.saveOptions = saveOptions;
this.monitor = monitor;
}
/// <summary>
/// Mencoba untuk mengonversi gambar dari satu format ke format lain. Menangani interupsi.
/// </summary>
public void ThreadProc()
{
using (Image image = Image.Load(this.inputPath))
{
Multithreading.InterruptMonitor.ThreadLocalInstance = this.monitor;
try
{
image.Save(this.outputPath, this.saveOptions);
Assert.Fail("Interupsi yang diharapkan.");
}
catch (CoreExceptions.OperationInterruptedException e)
{
System.Console.WriteLine("Thread simpan #{0} selesai di {1}", System.Threading.Thread.CurrentThread.ManagedThreadId, System.DateTime.Now);
System.Console.WriteLine(e);
}
catch (System.Exception e)
{
System.Console.WriteLine(e);
}
finally
{
Multithreading.InterruptMonitor.ThreadLocalInstance = null;
}
}
}
}
PSDNET-50 Membuat kemungkinan untuk meratakan layer
// Meratakan seluruh PSD
string sourceFileName = "TigaLayerBiasaSemiTransparan.psd";
string exportPath = "TigaLayerSemiTransparanMeratakan.psd";
using (var im = (PsdImage)(Image.Load(sourceFileName)))
{
im.FlattenImage();
im.Save(exportPath);
}
// Menggabungkan satu layer dengan layer lain
string sourceFileName = "TigaLayerBiasaSemiTransparan.psd";
string exportPath = "TigaLayerSemiTransparanPerLayer.psd";
using (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);
// Menyiapkan lapisan yang digabungkan
im.Layers = new Layer[] { layer2 };
im.Save(exportPath);
}
PSDNET-49 Menambahkan pengaturan opasitas pengisian dalam layer.
// Mengubah properti Opasitas Pengisian
string sourceFileName = "ContohPengisianOpasitas.psd";
string exportPath = "ContohPengisianOpasitasBerubah.psd";
using (var im = (PsdImage)(Image.Load(sourceFileName)))
{
var layer = im.Layers[2];
layer.FillOpacity = 5;
im.Save(exportPath);
}
PSDNET-43 Menerapkan rendering dari Kurva Penyesuaian Layer
// Pengeditan layer Kurva
string sourceFileName = "LayerPenyesuaianKurva";
string psdPathAfterChange = "LayerPenyesuaianKurvaBerubah";
string pngExportPath = "LayerPenyesuaianKurvaBerubah";
for (int j = 1; j < 2; j++)
{
using (var im = LoadFile(sourceFileName + j.ToString() + ".psd"))
{
foreach (var layer in 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);
}
}
}
}
// Simpan PSD
im.Save(psdPathAfterChange + j.ToString() + ".psd");
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath + j.ToString() + ".png", saveOptions);
}
PSDNET-42 Menambahkan dukungan dari Layer Penyesuaian Kurva
// Pengeditan layer Kurva
string sourceFileName = "LayerPenyesuaianKurva";
string psdPathAfterChange = "LayerPenyesuaianKurvaBerubah";
for (int j = 1; j < 2; j++)
{
using (var im = LoadFile(sourceFileName + j.ToString() + ".psd"))
{
foreach (var layer in 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);
}
}
}
}
// Simpan PSD
im.Save(psdPathAfterChange + j.ToString() + ".psd");
}
PSDNET-41 Menerapkan rendering dari Layer Penyesuaian Level
// Pengeditan layer Level
string sourceFileName = "LayerPenyesuaianLevel.psd";
string psdPathAfterChange = "LayerPenyesuaianLevelBerubah.psd";
string pngExportPath = "LayerPenyesuaianLevelBerubah.png";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (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;
}
}
// Simpan PSD
im.Save(psdPathAfterChange);
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath, saveOptions);
}
PSDNET-40 Menambahkan dukungan dari Layer penyesuaian Level
// Pengeditan layer Level
string sourceFileName = "LayerPenyesuaianLevel.psd";
string psdPathAfterChange = "LayerPenyesuaianLevelBerubah.psd";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (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;
}
}
// Simpan PSD
im.Save(psdPathAfterChange);
}
PSDNET-37 Menambahkan dukungan dari Layer Penyesuaian Mixer Saluran
// Rgb Channel Mixer
string sourceFileName = "ChannelMixerPenyesuaianLayerRgb.psd";
string psdPathAfterChange = "ChannelMixerPenyesuaianLayerRgbBerubah.psd";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (layer is RgbChannelMixerLayer)
{
var rgbLayer = (RgbChannelMixerLayer)layer;
rgbLayer.RedChannel.Blue = 100;
rgbLayer.BlueChannel.Green = -100;
rgbLayer.GreenChannel.Constant = 50;
}
}
im.Save(psdPathAfterChange);
}
// Cmyk Channel Mixer
string sourceFileName = "ChannelMixerPenyesuaianLayerCmyk.psd";
string psdPathAfterChange = "ChannelMixerPenyesuaianLayerCmykBerubah.psd";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (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);
}
// Menambahkan layer baru(Cmyk untuk contoh ini)
string sourceFileName = "CmykDenganAlpha.psd";
string psdPathAfterChange = "ChannelMixerPenyesuaianLayerCmykBerubah.psd";
using (var im = LoadFile(sourceFileName))
{
var newlayer = im.AddChannelMixerAdjustmentLayer();
newlayer.GetChannelByIndex(2).Constant = 50;
newlayer.GetChannelByIndex(0).Constant = 50;
im.Save(psdPathAfterChange);
}
PSDNET-35 Menambahkan dukungan dari Layer Penyesuaian Hue/Saturasi
// Pengeditan layer Hue/Saturasi
string sourceFileName = "HueSaturationPenyesuaianLayer.psd";
string psdPathAfterChange = "HueSaturationPenyesuaianLayerBerubah.psd";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (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);
}
// Menambahkan layer Hue/Saturasi
string sourceFileName = "ContohFoto.psd";
string psdPathAfterChange = "ContohFotoDitambahkanHueSaturation.psd";
using (PsdImage im = LoadFile(sourceFileName))
{
this.SaveForVisualTest(im, this.OutputPath, prefix + file, "sebelum");
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 Menerapkan rendering dari Layer Penyesuaian Paparan untuk ekspor.
// Pengeditan layer Paparan
string sourceFileName = "LayerPenyesuaianExposure.psd";
string psdPathAfterChange = "LayerPenyesuaianExposureBerubah.psd";
string pngExportPath = "LayerPenyesuaianExposureBerubah.png";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (layer is ExposureLayer)
{
var expLayer = (ExposureLayer)layer;
expLayer.Exposure = 2;
expLayer.Offset = -0.25f;
expLayer.GammaCorrection = 0.5f;
}
}
// Simpan PSD
im.Save(psdPathAfterChange);
end
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath, saveOptions);
}
// Layer paparan tambahan
string sourceFileName = "ContohFoto.psd";
string psdPathAfterChange = "ContohFotoDitambahkanExposure.psd";
string pngExportPath = "ContohFotoDitambahkanExposure.png";
using (PsdImage im = LoadFile(sourceFileName))
{
var newlayer = im.AddExposureAdjustmentLayer();
newlayer.Exposure = 2;
newlayer.Offset = -0.25f;
newlayer.GammaCorrection = 2f;
// Simpan PSD
im.Save(psdPathAfterChange);
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath, saveOptions);
}
PSDNET-31 Menambahkan dukungan untuk eksport dari ChannelMixer adjustment layer
// Rgb Channel Mixer
string sourceFileName = "ChannelMixerPenyesuaianLayerRgb.psd";
string psdPathAfterChange = "ChannelMixerPenyesuaianLayerRgbBerubah.psd";
string pngExportPath = "ChannelMixerPenyesuaianLayerRgbBerubah.png";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (layer is RgbChannelMixerLayer)
{
var rgbLayer = (RgbChannelMixerLayer)layer;
rgbLayer.RedChannel.Blue = 100;
rgbLayer.BlueChannel.Green = -100;
rgbLayer.GreenChannel.Constant = 50;
}
}
// Simpan PSD
im.Save(psdPathAfterChange);
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath, saveOptions);
}
// Cmyk Channel Mixer
string sourceFileName = "ChannelMixerPenyesuaianLayerCmyk.psd";
string psdPathAfterChange = "ChannelMixerPenyesuaianLayerCmykBerubah.psd";
string pngExportPath = "ChannelMixerPenyesuaianLayerCmykBerubah.png";
using (var im = LoadFile(sourceFileName))
{
foreach (var layer in im.Layers)
{
if (layer is CmykChannelMixerLayer)
{
var cmykLayer = (CmykChannelMixerLayer)layer;
cmykLayer.CyanChannel.Black = 20;
cmykLayer.MagentaChannel.Yellow = 50;
cmykLayer.YellowChannel.Cyan = -25;
cmykLayer.BlackChannel.Yellow = 25;
}
}
// Simpan PSD
im.Save(psdPathAfterChange);
// Simpan PNG
var saveOptions = new PngOptions();
saveOptions.ColorType = PngColorType.TruecolorWithAlpha;
im.Save(pngExportPath, saveOptions);
}