Aspose.PSD for Java 23.6 - 릴리스 노트

요약 카테고리
PSDJAVA-479 TimeLine API 리팩터링 향상
PSDJAVA-480 왜곡 렌더링 시 아티팩트 제거 향상
PSDJAVA-481 왜곡 렌더링 최적화 향상
PSDJAVA-482 임계값 조정 레이어 지원 기능
PSDJAVA-483 선택적 색상 조정 레이어 지원 기능
PSDJAVA-484 PSD 타임라인을 애니메이티드 GIF 파일로 내보내기 가능 기능
PSDJAVA-485 사각형 테두리 없이 TextLayer 지원 기능
PSDJAVA-486 ShapeLayer 지원 기능
PSDJAVA-487 스마트 객체의 이미지 교체가 업데이트되지 않음 버그
PSDJAVA-488 PSD 파일을 다음 예외와 함께 PSD로 저장할 수 없음: RGB 및 Lab 모드는 3채널 미만이나 4채널 이상을 포함할 수 없음 버그
PSDJAVA-489 Photoshop의 편집 모드에서 TextLayer를 열 경우 텍스트 정렬이 손실됨 버그
PSDJAVA-490 PSD 파일 저장 시 Null 참조 예외 발생 버그
PSDJAVA-491 ShapeLayer 로드 시 예외 발생: 벡터 원점 바운드에 대한 점은 아직 지원되지 않음 버그
PSDJAVA-492 VogkResource 로드 시 예외 발생: 점이 DoubleStructures로 저장되어 UnitStructures로 읽음 버그
PSDJAVA-493 ShapeLayer의 LayerType이 비어 있음 버그

공개 API 변경

추가된 API:

  • M:com.aspose.psd.PixelDataFormat.getRgba64Bpp
  • F:com.aspose.psd.fileformats.psd.PsdImage.horizontalResolution
  • M:com.aspose.psd.fileformats.psd.PsdImage.addSelectiveColorAdjustmentLayer
  • M:com.aspose.psd.fileformats.psd.PsdImage.addVibranceAdjustmentLayer
  • M:com.aspose.psd.fileformats.psd.PsdImage.addThresholdAdjustmentLayer
  • M:com.aspose.psd.fileformats.psd.PsdImage.getTimeline
  • M:com.aspose.psd.fileformats.psd.layers.fillsettings.GradientColorPoint.getColorMode
  • M:com.aspose.psd.fileformats.psd.layers.fillsettings.GradientColorPoint.setColorMode(short)
  • M:com.aspose.psd.fileformats.psd.layers.fillsettings.IPatternFillSettings.getAngle
  • M:com.aspose.psd.fileformats.psd.layers.fillsettings.IPatternFillSettings.setAngle(double)
  • M:com.aspose.psd.fileformats.psd.layers.fillsettings.PatternFillSettings.getAngle
  • M:com.aspose.psd.fileformats.psd.rawcolor.RawColor.#ctor(com.aspose.psd.PixelDataFormat,short)
  • M:com.aspose.psd.fileformats.psd.rawcolor.RawColor.getColorMode
  • M:com.aspose.psd.fileformats.psd.rawcolor.RawColor.setColorMode(short)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.ShmdResource.getSubResources
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.vectorpaths.VectorShapeBoundingBox.getPointsUnitType
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.vectorpaths.VectorShapeBoundingBox.setPointsUnitType(int)
  • T:com.aspose.psd.fileformats.psd.layers.text.rendering.TextOrientation
  • F:com.aspose.psd.fileformats.psd.layers.text.rendering.TextOrientation.Horizontal
  • F:com.aspose.psd.fileformats.psd.layers.text.rendering.TextOrientation.Vertical
  • M:com.aspose.psd.imageoptions.PsdOptions.isColorModeSet
  • T:com.aspose.psd.fileformats.psd.layers.animation.Frame
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.#ctor
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.getDelay
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.getDisposalMethod
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.getFrGA
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.getId
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.getLayerStates
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.setDelay(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.setDisposalMethod(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.setFrGA(double)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.setId(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Frame.setLayerStates(com.aspose.psd.fileformats.psd.layers.animation.LayerState[])
  • T:com.aspose.psd.fileformats.psd.layers.animation.FrameDisposalMethod
  • F:com.aspose.psd.fileformats.psd.layers.animation.FrameDisposalMethod.Dispose
  • F:com.aspose.psd.fileformats.psd.layers.animation.FrameDisposalMethod.DoNotDispose
  • F:com.aspose.psd.fileformats.psd.layers.animation.FrameDisposalMethod.Automatic
  • T:com.aspose.psd.fileformats.psd.layers.animation.LayerState
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.#ctor
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getBlendMode
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getEnabled
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getFillOpacity
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getHorizontalFXRf
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getId
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getOpacity
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getPositionOffset
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getStateEffects
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.getVerticalFXRf
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setBlendMode(long)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setEnabled(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setFillOpacity(double)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setHorizontalFXRf(double)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setId(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setOpacity(double)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setPositionOffset(com.aspose.psd.Point)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerState.setVerticalFXRf(double)
  • T:com.aspose.psd.fileformats.psd.layers.animation.Timeline
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.#ctor
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getAFSt
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getActiveFrameIndex
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getFrame(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getFrames
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getFramesList
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getFsID
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getLoopesCount
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.getPsdImage
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.save(java.lang.String,com.aspose.psd.ImageOptionsBase)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.save(com.aspose.psd.system.io.Stream,com.aspose.psd.ImageOptionsBase)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.setAFSt(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.setFrames(com.aspose.psd.fileformats.psd.layers.animation.Frame[])
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.setFsID(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.setLoopesCount(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.setPsdImage(com.aspose.psd.fileformats.psd.PsdImage)
  • M:com.aspose.psd.fileformats.psd.layers.animation.Timeline.switchActiveFrame(int)
  • T:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addColorOverlay
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addDropShadow
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addGradientOverlay
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addInnerShadow
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addOuterGlow
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addOrReplaceEffect(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addPatternOverlay
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.addStroke(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.getEffects
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.getLayerStyleFX
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.getScale
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.setScale(double)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.setVisible(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.clearLayerStyle
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.removeEffectAt(int)
  • M:com.aspose.psd.fileformats.psd.layers.animation.LayerStateEffects.isVisible
  • T:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getBlendMode
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getEffectType
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getFillColor
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getIntensity
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getJitter
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getNoise
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getOpacity
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getRange
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getSpread
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.getSize
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.isAntiAliasing
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.isSoftBlend
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.isVisible
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setAntiAliasing(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setBlendMode(long)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setFillColor(com.aspose.psd.fileformats.psd.layers.fillsettings.IFillSettings)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setIntensity(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setJitter(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setNoise(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setOpacity(byte)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setRange(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setSpread(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setSoftBlend(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setSize(int)
  • M:com.aspose.psd.fileformats.psd.layers.layereffects.OuterGlowEffect.setVisible(boolean)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.#ctor
  • T:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.#ctor
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getKey
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getLayers
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getLength
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getLength(int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getPsdVersion
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.getSignature
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.save(com.aspose.psd.StreamContainer,int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.LrXxResource.setLayers(com.aspose.psd.fileformats.psd.layers.Layer[])

삭제된 API:

  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.getKey
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.getLayers
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.getLength
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.getPsdVersion
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.getSignature
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.save(com.aspose.psd.StreamContainer,int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr16Resource.setLayers(com.aspose.psd.fileformats.psd.layers.Layer[])
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.#ctor(int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.getKey
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.getLayers
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.getLength
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.getPsdVersion
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.getSignature
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.save(com.aspose.psd.StreamContainer,int)
  • M:com.aspose.psd.fileformats.psd.layers.layerresources.Lr32Resource.setLayers(com.aspose.psd.fileformats.psd.layers.Layer[])

사용 예시:

PSDJAVA-482. 임계값 조정 레이어 지원

public static void main(String[] args) throws Exception {
    String sourceFileWithThresholdLayer = "flowers_threshold_source.psd";
    String outputPsdWithThresholdLayer = "flowers_threshold_output.psd";
    String outputPngWithThresholdLayer = "flowers_threshold_output.png";

    String sourceFileWithoutThresholdLayer = "flowers_source.psd";
    String outputPsdWithoutThresholdLayer = "flowers_output.psd";
    String outputPngWithoutThresholdLayer = "flowers_output.png";

    // 이미지에서 Threshold 조정 레이어 가져와서 변경
    try (PsdImage image = (PsdImage) Image.load(sourceFileWithThresholdLayer)) {
        for (Layer layer : image.getLayers    하는 경우 {
            if (layer instanceof ThresholdLayer) {
                // Threshold 조정 레이어 가져오기
                ThresholdLayer thrsLayer = (ThresholdLayer) layer;
                short level = thrsLayer.getLevel();

                // 레이어 매개변수 확인
                assertAreEqual(level, (short) 115);

                // 레이어 매개변수 설정
                thrsLayer.setLevel((short) 50);

                image.save(outputPsdWithThresholdLayer);
                image.save(outputPngWithThresholdLayer, new PngOptions());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    // 이미지에 Threshold 조정 레이어 추가 및 설정
    try (PsdImage image = (PsdImage) Image.load(sourceFileWithoutThresholdLayer)) {
        // Threshold 조정 레이어 추가
        ThresholdLayer thresholdLayer = image.addThresholdAdjustmentLayer();

        // 레이어 매개변수 설정
        thresholdLayer.setLevel((short) 115);

        image.save(outputPsdWithoutThresholdLayer);
        image.save(outputPngWithoutThresholdLayer, new PngOptions());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

static void assertAreEqual(Object expected, Object actual) {
    assertAreEqual(expected, actual, "객체가 동일하지 않습니다.");
}

PSDJAVA-483. 선택적 색상 조정 레이어 지원

public static void main(String[] args) throws Exception {
    String sourceFileWithSelectiveColorLayer = "houses_selectiveColor_source.psd";
    String outputPsdWithSelectiveColorLayer = "houses_selectiveColor_output.psd";
    String outputPngWithSelectiveColorLayer = "houses_selectiveColor_output.png";

    String sourceFileWithoutSelectiveColorLayer = "houses_source.psd";
    String outputPsdWithoutSelectiveColorLayer = "houses_output.psd";
    String outputPngWithoutSelectiveColorLayer = "houses_output.png";

    // 이미지에서 선택적 색상 조정 레이어 가져와서 변경
    try (PsdImage image = (PsdImage) Image.load(sourceFileWithSelectiveColorLayer)) {
        for (Layer layer : image.getLayers()) {
            if (layer instanceof SelectiveColorLayer) {
                // 선택적 색상 조정 레이어 가져오기
                SelectiveColorLayer selcLayer = (SelectiveColorLayer) layer;
                CmykCorrection redCorrection = selcLayer.getCmykCorrection(SelectiveColorsTypes.Reds);
                CmykCorrection yellowCorrection = selcLayer.getCmykCorrection(SelectiveColorsTypes.Yellows);
                CmykCorrection greenCorrection = selcLayer.getCmykCorrection(SelectiveColorsTypes.Greens);
                CmykCorrection blueCorrection = selcLayer.getCmykCorrection(SelectiveColorsTypes.Blues);

                // 레이어 매개변수 확인
                assertAreEqual(CorrectionMethodTypes.Absolute, selcLayer.getCorrectionMethod());

                assertAreEqual(redCorrection.getCyan(), (short) -31);
                assertAreEqual(redCorrection.getMagenta(), (short) -12);
                assertAreEqual(redCorrection.getYellow(), (short) 27);
                assertAreEqual(redCorrection.getBlack(), (short) 33);

                assertAreEqual(yellowCorrection.getCyan(), (short) -22);
                assertAreEqual(yellowCorrection.getMagenta(), (short) -19);
                assertAreEqual(yellowCorrection.getYellow(), (short) 8);
                assertAreEqual(yellowCorrection.getBlack(), (short) 0);

                assertAreEqual(greenCorrection.getCyan(), (short) 0);
                assertAreEqual(greenCorrection.getMagenta(), (short) 0);
                assertAreEqual(greenCorrection.getYellow(), (short) 0);
                assertAreEqual(greenCorrection.getBlack(), (short) 0);

                assertAreEqual(blueCorrection.getCyan(), (short) 58);
                assertAreEqual(blueCorrection.getMagenta(), (short) 18);
                assertAreEqual(blueCorrection.getYellow(), (short) 1);
                assertAreEqual(blueCorrection.getBlack(), (short) 7);

                // 레이어 매개변수 변경
                selcLayer.setCorrectionMethod(CorrectionMethodTypes.Relative);
                CmykCorrection redsCmykCorrection = new CmykCorrection();
                redsCmykCorrection.setCyan((short) 12);
                redsCmykCorrection.setMagenta((short) -20);
                redsCmykCorrection.setYell