Aspose.PSD for .NET 22.9 - 릴리스 노트
Contents
[
Hide
]
이 페이지에는 Aspose.PSD for .NET 22.9에 대한 릴리스 노트가 포함되어 있습니다.
- 이 릴리스에서 16비트 익스포트의 경우에 재귀적인 문제가 발생하여, 이 기능을 사용할 때 주의가 필요합니다. 16비트 이미지 처리가 주요 기능인 경우에는 Aspose.PSD를 22.9로 업데이트하지 마십시오.
- Photoshop의 여러 버전 사용자는 레이어를 읽는 오류 창을 만날 수 있으며, PSD 파일 작업에는 영향을 미치지 않습니다.
이러한 문제에 대한 해결책을 개발 중에 있습니다.
키 | 개요 | 카테고리 |
---|---|---|
PSDNET-1237 | 효과 및 관련 데이터를 포함하는 내부 레이어 스타일 FX 모델을 만들어, 효과 리소스 Lfx2, lmfx 및 mlst에서 단일 모델 사용 | 개선 |
PSDNET-1227 | 시간축 모델에서 레이어 상태에 대한 효과 정보를 가지는 ‘Lefx’ 구조체의 읽기 및 쓰기 추가 | 기능 |
PSDNET-1230 | PsdImage에서 레이어에 TimeLine 레이어 상태 적용 | 기능 |
PSDNET-1072 | PSD 파일 저장 시(RGB/16비트) 투명도 부정확성 | 버그 |
PSDNET-1140 | PSB 문서를 열 때 전역 레이어 리소스 단계에서 예외 발생 | 버그 |
PSDNET-1266 | 특정 파일 처리 중 메모리 누수 | 버그 |
공개 API 변경
추가된 API:
- P:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerState.PositionOffset
- P:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerState.StateEffects
- T:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects
- P:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.IsVisible
- P:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.Effects
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddDropShadow
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddInnerShadow
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddOuterGlow
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddStroke(Aspose.PSD.FileFormats.Psd.Layers.FillSettings.FillType)
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddColorOverlay
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddGradientOverlay
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.AddPatternOverlay
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.ClearLayerStyle
- M:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerStateEffects.RemoveEffectAt(System.Int32)
제거된 API:
- P:Aspose.PSD.FileFormats.Psd.Layers.Animation.LayerState.Offset
사용 예시:
PSDNET-1072. PSD 파일 (RGB/16비트)을 8비트로 익스포트할 때 투명도 부정확성
string inputPsdFile = "8bitWithTransparency.psd";
string outputPsdFile = "16bitWithTransparency.psd";
string outputImageFile = "OutputWithTransparency.png";
using (var img = Image.Load(inputPsdFile))
{
// 16비트 저장 옵션
PsdOptions p16 = new PsdOptions() { ChannelBitsCount = 16, ColorMode = ColorModes.Rgb };
img.Save(outputPsdFile, p16);
}
using (var img = Image.Load(outputPsdFile))
{
// 16비트 색상으로 이미지 저장
img.Save(outputImageFile, new PngOptions() { ColorType = Aspose.PSD.FileFormats.Png.PngColorType.TruecolorWithAlpha });
}
PSDNET-1140. PSB 문서를 열 때 전역 레이어 리소스 단계에서 예외 발생
string sourcePsdFile = "input.psb";
string outputImageFile = "output.png";
using (var image = (PsdImage)Image.Load(sourcePsdFile))
{
// 여기에 예외가 발생해서는 안 됩니다.
image.Save(outputImageFile, new PngOptions() { ColorType = PngColorType.GrayscaleWithAlpha });
}
PSDNET-1227. 시간축 모델에 레이어 상태의 ‘Lefx’ 구조체의 읽기 및 쓰기 추가
string sourceFile = "4_animated.psd";
string outputFile = "output.psd";
using (var psdImage = (PsdImage)Image.Load(sourceFile))
{
TimeLine timeLine = TimeLine.InitializeFrom(psdImage);
int[] layerIds = timeLine.LayerIds;
var layerStateEffects11 = timeLine.Frames[1].LayerStates[layerIds[1]].StateEffects;
layerStateEffects11.AddDropShadow();
layerStateEffects11.AddGradientOverlay();
var layerStateEffects21 = timeLine.Frames[2].LayerStates[layerIds[1]].StateEffects;
layerStateEffects21.AddStroke(FillType.Color);
layerStateEffects21.IsVisible = false;
timeLine.ApplyTo(psdImage);
psdImage.Save(outputFile);
}
PSDNET-1230. PsdImage에 시간축 레이어 상태를 적용
string sourceFile = "3_animated.psd";
string outputPsd = "output.psd";
string outputPng = "output.png";
using (var psdImage = (PsdImage)Image.Load(sourceFile, new PsdLoadOptions() { LoadEffectsResource = true }))
{
TimeLine timeLine = TimeLine.InitializeFrom(psdImage);
var layerIds = timeLine.LayerIds;
var layerState11 = timeLine.Frames[1].LayerStates[layerIds[1]];
timeLine.Frames[1].LayerStates[layerIds[1]].StateEffects.AddPatternOverlay();
layerState11.BlendMode = BlendMode.Multiply;
// 활성 프레임을 0에서 1로 변경하여 레이어에 LayerState를 적용함
timeLine.ActiveFrame = 1;
// 변경사항을 PsdImage에 적용
timeLine.ApplyTo(psdImage);
psdImage.Save(outputPsd);
psdImage.Save(outputPng, new PngOptions());
}
PSDNET-1266. 특정 파일 처리 중 메모리 누수
string[] filesToLoad = new string[] { "testPsd0.psd", "testPsd1.psd", "testPsd2.psd" };
int inputNumber = GC.MaxGeneration;
#if NETCOREAPP
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
#endif
GC.Collect(inputNumber, GCCollectionMode.Forced);
GC.WaitForFullGCComplete();
double memCount = (double)Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024;
Console.WriteLine("테스트 전 총 사용한 바이트: {0:N2} MiB", memCount);
double max = memCount;
for (int i = 0; i < 50; i++)
{
int fileIndex = i % inputNumber;
string sourceFile = Path.Combine(baseFolder, filesToLoad[fileIndex]);
// CheckOpenSaving
using (MemoryStream outputStream = new MemoryStream())
{
using (PsdImage psd = (PsdImage)Image.Load(sourceFile, new PsdLoadOptions { LoadEffectsResource = true }))
{
psd.Save(outputStream, new JpegOptions() { Quality = 100 });
}
}
#if NETCOREAPP
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
#endif
GC.Collect(inputNumber, GCCollectionMode.Forced);
GC.WaitForFullGCComplete();
memCount = (double)Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024;
max = Math.Max(max, memCount);
}
memCount = (double)Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024;
Console.WriteLine("테스트 후 총 사용한 바이트: {0:N2} MiB", memCount);
Assert.IsTrue(Math.Abs(memCount - max) < 20, "기본적인 기능에서 메모리 누수 발견!");