Browse our Products
Aspose.PSD for Java 20.4 - Release Notes
Key | Summary | Category |
---|---|---|
PSDJAVA-156 | Support of the ‘Vector Origination Data’ resource | Feature |
PSDJAVA-171 | Support of lclrResource (Sheet color setting) | Feature |
PSDJAVA-157 | Support properties from LengthRecord data. (Path operations (boolean operations), index of the shape in the layer, count of the bezier knot records) | Feature |
PSDJAVA-158 | Support of Image Section Resource #1010 Background color | Feature |
PSDJAVA-161 | Adding of Fill Layers at runtime | Feature |
PSDJAVA-168 | Support of Image Section Resource #1009 Border information. | Feature |
PSDJAVA-169 | Support of Layers in AI Format Files | Feature |
PSDJAVA-163 | Support Reading and Editing of Gradient Overlay Layer Effect | Feature |
PSDJAVA-164 | Rendering of Gradient Overlay Layer Effect | Feature |
PSDJAVA-149 | Aspose.PSD for java error when getting textData.items property of text layer | Bug |
PSDJAVA-166 | Fix saving PSD image with Grayscale ColorMode and 16 bit per channel to grayscale PSD format | Bug |
PSDJAVA-167 | Fix saving PSD image with Grayscale ColorMode and 16 bit per channel to PNG format | Bug |
PSDJAVA-159 | The GradientOverlayEffect.BlendMode property changes are not displayed in Photoshop. | Bug |
Public API Changes
Added APIs:
- M:com.aspose.psd.fileformats.psd.PsdImage.addBlackWhiteAdjustmentLayer
- M:com.aspose.psd.fileformats.psd.PsdImage.addExposureAdjustmentLayer(float)
- M:com.aspose.psd.fileformats.psd.PsdImage.addExposureAdjustmentLayer(float,float)
- T:com.aspose.psd.fileformats.psd.PsdVersion
- F:com.aspose.psd.fileformats.psd.PsdVersion.Psb
- F:com.aspose.psd.fileformats.psd.PsdVersion.Psd
- F:com.aspose.psd.fileformats.psd.layers.BlendMode.Absent
- M:com.aspose.psd.fileformats.psd.layers.ChannelInformation.#ctor(short,byte[],byte[])
- M:com.aspose.psd.fileformats.psd.layers.Layer.#ctor(com.aspose.psd.RasterImage)
- M:com.aspose.psd.fileformats.psd.layers.Layer.#ctor(com.aspose.psd.internal.ij.k,com.aspose.psd.IColorPalette)
- M:com.aspose.psd.fileformats.psd.layers.LayerGroup.getBlendModeKey
- M:com.aspose.psd.fileformats.psd.layers.LayerGroup.setBlendModeKey(long)
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesContinuousManager.getChannelsCount
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesContinuousManager.isChannelUsed(int)
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesDiscreteManager.#ctor(int)
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesDiscreteManager.getChannelsCount
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesDiscreteManager.isChannelUsed(int)
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesManager.getChannelsCount
- M:com.aspose.psd.fileformats.psd.layers.layerresources.CurvesManager.isChannelUsed(int)
- M:com.aspose.psd.fileformats.psd.layers.layerresources.LayerSectionResource.setBlendModeKey(long)
- M:com.aspose.psd.fileformats.psd.layers.text.IText.producePortions(java.lang.String[],com.aspose.psd.fileformats.psd.layers.text.ITextStyle,com.aspose.psd.fileformats.psd.layers.text.ITextParagraph)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getBaselineShift
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getFauxBold
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getFauxItalic
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getFontBaseline
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getFontCaps
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getStrikethrough
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.getUnderline
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setBaselineShift(double)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setFauxBold(boolean)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setFauxItalic(boolean)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setFontBaseline(int)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setFontCaps(int)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setLeading(double)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setStrikethrough(boolean)
- M:com.aspose.psd.fileformats.psd.layers.text.ITextStyle.setUnderline(boolean)
- T:com.aspose.psd.fileformats.psd.layers.text.rendering.FontBaseline
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontBaseline.None
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontBaseline.Subscript
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontBaseline.Superscript
- T:com.aspose.psd.fileformats.psd.layers.text.rendering.FontCaps
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontCaps.AllCaps
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontCaps.None
- F:com.aspose.psd.fileformats.psd.layers.text.rendering.FontCaps.SmallCaps
- M:com.aspose.psd.sources.StreamSource.#ctor(java.io.OutputStream)
- M:com.aspose.psd.sources.StreamSource.#ctor(java.io.OutputStream,boolean)
Removed APIs:
- M:com.aspose.psd.fileformats.psd.layers.Layer.#ctor(com.aspose.psd.internal.ij.k,com.aspose.psd.IColorPalette)
- M:com.aspose.psd.xmp.schemas.xmpdm.XmpDynamicMediaPackage.setAudioSampleType(com.aspose.psd.xmp.schemas.xmpdm.AudioSampleType)
Usage examples:
PSDJAVA-156. Support of the ‘Vector Origination Data’ resource
/*
An example of reading and modifying a Vector Origination Data resource.
*/
// Keep the methods in the local scope for simplicity
class LocalScopeExtension
{
VogkResource findFirstVogkResource(LayerResource[] layerResources)
{
VogkResource vogkResource = null;
for (LayerResource layerResource : layerResources)
{
if (layerResource instanceof VogkResource)
{
vogkResource = (VogkResource)layerResource;
break;
}
}
if (vogkResource == null)
{
throw new Exception("VogkResource not found.");
}
return vogkResource;
}
}
LocalScopeExtension $ = new LocalScopeExtension();
String inPsdFilePath = "VectorOriginationDataResource.psd";
String outPsdFilePath = "out_VectorOriginationDataResource_.psd";
// Load a PSD file containing a predefined VOGK resource
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
// Find first VogkResource in resources of the predefined layer
VogkResource vogkResource = $.findFirstVogkResource(
psdImage.getLayers()[1].getResources());
// Verify predefined resource properties
if (vogkResource.getShapeOriginSettings().length != 1 ||
!vogkResource.getShapeOriginSettings()[0].isShapeInvalidated() ||
vogkResource.getShapeOriginSettings()[0].getOriginIndex() != 0)
{
throw new Exception("VogkResource was misread.");
}
// Modify some VogkResource properties
vogkResource.setShapeOriginSettings(new VectorShapeOriginSettings[]
{
vogkResource.getShapeOriginSettings()[0],
new VectorShapeOriginSettings(true, 1)
});
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-171. Support of lclrResource (Sheet color setting)
/*
An example of using Layer Sheet Color to visually highlight layers. For example you can
update some layers in PSD and then highlight by color the layer which you want to attract
attention.
*/
class LocalScopeExtension
{
void checkSheetColorsAndRerverse(Short[] sheetColors, PsdImage psdImage)
{
int layersCount = psdImage.getLayers().length;
for (int layerIndex = 0; layerIndex < layersCount; layerIndex++)
{
Layer layer = psdImage.getLayers()[layerIndex];
for (LayerResource layerResource : layer.getResources())
{
if (!(layerResource instanceof LclrResource))
{
continue;
}
// The lcrl resource always presents in psd file resource list.
LclrResource resource = (LclrResource)layerResource;
if (resource.getColor() != sheetColors[layerIndex])
{
throw new Exception("Sheet Color has been read wrong");
}
// Reverse of style sheet colors. Set up of Layer color highlight.
resource.setColor(sheetColors[layersCount - layerIndex - 1]);
break;
}
}
}
}
LocalScopeExtension $ = new LocalScopeExtension();
String inPsdFilePath = "AllLclrResourceColors.psd";
String outPsdFilePath = "AllLclrResourceColorsReversed.psd";
// In the file colors of layers highlighting are in this order
Short[] sheetColors = new Short[] {
SheetColorHighlightEnum.Red,
SheetColorHighlightEnum.Orange,
SheetColorHighlightEnum.Yellow,
SheetColorHighlightEnum.Green,
SheetColorHighlightEnum.Blue,
SheetColorHighlightEnum.Violet,
SheetColorHighlightEnum.Gray,
SheetColorHighlightEnum.NoColor
};
// Load a PSD file containing a predefined LclrResource
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
$.checkSheetColorsAndRerverse(sheetColors, psdImage);
psdImage.save(outPsdFilePath, new PsdOptions());
}
finally
{
psdImage.dispose();
}
// Load a just saved PSD file
PsdImage psdImage1 = (PsdImage)Image.load(outPsdFilePath);
try
{
// Reverse colors
List<Short> sheetColorList = Arrays.asList(sheetColors);
Collections.reverse(sheetColorList);
$.checkSheetColorsAndRerverse(sheetColorList.toArray(new Short[0]), psdImage1);
}
finally
{
psdImage1.dispose();
}
PSDJAVA-157. Support properties from LengthRecord data. (Path operations (boolean operations), index of the shape in layer, count of the bezier knot records)
/*
An example of changing path operations when working with shapes. The program reads
a predefined vector path records (LengthRecord) and changes their path operations then saves
a modified copy of the document as a new PSD file.
*/
String inPsdFilePath = "PathOperationsShape.psd";
String outPsdFilePath = "out_" + inPsdFilePath;
// Load a PSD file containing a predefined vsms resource
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
// Find first VsmsResource in resources of the predefined layer
VsmsResource resource = null;
for (LayerResource layerResource : psdImage.getLayers()[1].getResources())
{
if (layerResource instanceof VsmsResource)
{
resource = (VsmsResource)layerResource;
break;
}
}
LengthRecord lengthRecord0 = (LengthRecord)resource.getPaths()[2];
LengthRecord lengthRecord1 = (LengthRecord)resource.getPaths()[7];
LengthRecord lengthRecord2 = (LengthRecord)resource.getPaths()[11];
// Change the way in which shapes are combined
lengthRecord0.setPathOperations(PathOperations.ExcludeOverlappingShapes);
lengthRecord1.setPathOperations(PathOperations.IntersectShapeAreas);
lengthRecord2.setPathOperations(PathOperations.SubtractFrontShape);
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-158. Support of Image Section Resource #1010 Background color
/*
An example of reading and modifying a background color resource.
*/
String inPsdFilePath = "input.psd";
String outPsdFilePath = "output.psd";
// Load a PSD file containing a predefined background color resource
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
BackgroundColorResource backgroundColorResource = null;
for (ResourceBlock imageResource : psdImage.getImageResources())
{
if (imageResource instanceof BackgroundColorResource)
{
backgroundColorResource = (BackgroundColorResource)imageResource;
break;
}
}
if (backgroundColorResource == null)
{
throw new Exception("BackgroundColorResource not found");
}
// Update color of the background color resource
backgroundColorResource.setColor(Color.getDarkRed());
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-161. Adding of Fill Layers at runtime
/*
An example of adding fill layers of different types to a Photoshop document.
*/
String outPsdFilePath = "output.psd";
// Create a Photoshop document with an empty canvas
PsdImage psdImage = new PsdImage(100, 100);
try
{
// Add fill layers of different types to PSD
FillLayer colorFillLayer = FillLayer.createInstance(FillType.Color);
colorFillLayer.setDisplayName("Color Fill Layer");
psdImage.addLayer(colorFillLayer);
FillLayer gradientFillLayer = FillLayer.createInstance(FillType.Gradient);
gradientFillLayer.setDisplayName("Gradient Fill Layer");
psdImage.addLayer(gradientFillLayer);
FillLayer patternFillLayer = FillLayer.createInstance(FillType.Pattern);
patternFillLayer.setDisplayName("Pattern Fill Layer");
patternFillLayer.setOpacity((byte)50);
psdImage.addLayer(patternFillLayer);
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-168. Support of Image Section Resource #1009 Border information
/*
An example of reading, modifying and saving a PSD file that contains a border information
resource.
*/
String inPsdFilePath = "input.psd";
String outPsdFilePath = "output.psd";
// Load a PSD file containing a predefined image resource
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
ResourceBlock[] imageResources = psdImage.getImageResources();
// Find first border information resource in image resources
BorderInformationResource borderInfoResource = null;
for (ResourceBlock imageResource : imageResources)
{
if (imageResource instanceof BorderInformationResource)
{
borderInfoResource = (BorderInformationResource)imageResource;
break;
}
}
// Update some properties of the border information resource
borderInfoResource.setWidth(0.1);
borderInfoResource.setUnit(PhysicalUnit.Inches);
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-169. Support of Layers in AI Format Files
/*
An example of exporting an AI file that contains layers to other file formats. The program
loads predefined AI file and verifies one before further exporting.
*/
class LocalScopeExtension
{
void assertIsTrue(boolean condition, String message)
{
if (!condition)
{
throw new FormatException(message);
}
}
}
LocalScopeExtension $ = new LocalScopeExtension();
String inAiFilePath = "form_8_2l3_7.ai";
String outPsdFilePath = "form_8_2l3_7_export.psd";
String outPngFilePath = "form_8_2l3_7_export.png";
// Load an AI file containing predefined layers
AiImage aiImage = (AiImage)Image.load(inAiFilePath);
try
{
// Check that AI layers were read correctly
AiLayerSection layer0 = aiImage.getLayers()[0];
$.assertIsTrue(layer0 != null, "Layer 0 should be not null.");
$.assertIsTrue(layer0.getName().equals("Layer 4"), "The Name property of the layer 0 should be Layer 4");
$.assertIsTrue(!layer0.isTemplate(), "The IsTemplate property of the layer 0 should be false.");
$.assertIsTrue(layer0.isLocked(), "The IsLocked property of the layer 0 should be true.");
$.assertIsTrue(layer0.isShown(), "The IsShown property of the layer 0 should be true.");
$.assertIsTrue(layer0.isPrinted(), "The IsPrinted property of the layer 0 should be true.");
$.assertIsTrue(!layer0.isPreview(), "The IsPreview property of the layer 0 should be false.");
$.assertIsTrue(layer0.isImagesDimmed(), "The IsImagesDimmed property of the layer 0 should be true.");
$.assertIsTrue(layer0.getDimValue() == 51, "The DimValue property of the layer 0 should be 51.");
$.assertIsTrue(layer0.getColorNumber() == 0, "The ColorNumber property of the layer 0 should be 0.");
$.assertIsTrue(layer0.getRed() == 79, "The Red property of the layer 0 should be 79.");
$.assertIsTrue(layer0.getGreen() == 128, "The Green property of the layer 0 should be 128.");
$.assertIsTrue(layer0.getBlue() == 255, "The Blue property of the layer 0 should be 255.");
$.assertIsTrue(layer0.getRasterImages().length == 0, "The pixels length property of the raster image in the layer 0 should equals 0.");
AiLayerSection layer1 = aiImage.getLayers()[1];
$.assertIsTrue(layer1 != null, "Layer 1 should be not null.");
$.assertIsTrue(layer1.getName().equals("Layer 1"), "The Name property of the layer 1 should be Layer 1");
$.assertIsTrue(layer1.getRasterImages().length == 1, "The length property of the raster images in the layer 1 should equals 1.");
AiRasterImageSection rasterImage = layer1.getRasterImages()[0];
$.assertIsTrue(rasterImage != null, "The raster image in the layer 1 should be not null.");
$.assertIsTrue(rasterImage.getPixels() != null, "The pixels property of the raster image in the layer 1 should be not null.");
$.assertIsTrue("".equals(rasterImage.getName()), "The Name property of the raster image in the layer 1 should be empty");
$.assertIsTrue(rasterImage.getPixels().length == 100, "The pixels length property of the raster image in the layer 1 should equals 100.");
// Export to a PSD file
aiImage.save(outPsdFilePath, new PsdOptions());
// Export to a PNG file with a white background
PngOptions pngOptions = new PngOptions();
pngOptions.setColorType(PngColorType.TruecolorWithAlpha);
aiImage.save(outPngFilePath, pngOptions);
}
finally
{
aiImage.dispose();
}
PSDJAVA-163. Support Reading and Editing of Gradient Overlay Layer Effect
/*
An example of applying the gradient overlay effect for an image layer.
*/
String inPsdFilePath = "psdnet256.psd";
String outPsdFilePath = "psdnet256.psd_output.psd";
// Support layer effects, if any
PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
psdLoadOptions.setLoadEffectsResource(true);
// Load a PSD file containing an image
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath, psdLoadOptions);
try
{
BlendingOptions layerBlendOptions = psdImage.getLayers()[1].getBlendingOptions();
// Search GradientOverlayEffect in a layer
GradientOverlayEffect gradientOverlayEffect = null;
for (ILayerEffect effect : layerBlendOptions.getEffects())
{
gradientOverlayEffect = (GradientOverlayEffect)effect;
if (gradientOverlayEffect != null)
{
break;
}
}
if (gradientOverlayEffect == null)
{
// Create a new GradientOverlayEffect if it not exists
gradientOverlayEffect = layerBlendOptions.addGradientOverlay();
}
// Add a bit of transparency to the effect
gradientOverlayEffect.setOpacity((byte)200);
// Change the blend mode of gradient effect
gradientOverlayEffect.setBlendMode(BlendMode.Hue);
// Get GradientFillSettings object to configure gradient overlay settings
GradientFillSettings settings = gradientOverlayEffect.getSettings();
// Set a new gradient with two colors
settings.setColorPoints(new IGradientColorPoint[]
{
new GradientColorPoint(Color.getGreenYellow(), 0, 50),
new GradientColorPoint(Color.getBlueViolet(), 4096, 50),
});
// Set an inclination of the gradient at an angle of 80 degrees
settings.setAngle(80);
// Scale gradient effect up to 150%
settings.setScale(150);
// Set type of gradient
settings.setGradientType(GradientType.Linear);
// Make the gradient opaque by setting the opacity to 100% at each transparency point
settings.getTransparencyPoints()[0].setOpacity(100);
settings.getTransparencyPoints()[1].setOpacity(100);
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
PSDJAVA-164. Rendering of Gradient Ovelay Layer Effect
/*
An example of loading and saving a PSD file containing a layer with a gradient overlay
effect applied.
*/
String inPsdFilePath = "gradientOverlayEffect.psd";
String outPngFilePath = "output.png";
String outPsdFilePath = "output.psd";
// Load a PSD file containing a predefined layer
PsdLoadOptions psdLoadOptions = new PsdLoadOptions();
psdLoadOptions.setLoadEffectsResource(true);
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath, psdLoadOptions);
try
{
// Save a copy of a PNG image as well as a PSD file
psdImage.save(outPngFilePath, new PngOptions());
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}
**
PSDJAVA-149. Aspose.PSD for java error when getting textData.items property of text layer
/*
An example of generating multiple PNG images from a PSD template file. The program just loop
for each layer and replace some placeholders with real data. A PNG image is created after
making necessary changes.
*/
// A container for keeping layer data that will be set
class NewLayerData
{
// Omit getters and setters for simplicity
Class layerType;
int justification;
String text;
NewLayerData(Class layerType, int justification, String text)
{
this.layerType = layerType;
this.justification = justification;
this.text = text;
}
}
String inPsdFilePath = "test.psd";
String outPngFilePath = "result.png";
final int justificationLeft = 0;
// Populate layer data to be set
Map<String, NewLayerData> newLayerDataByDisplayName = new HashMap<String, NewLayerData>();
newLayerDataByDisplayName.put(
"主标题", new NewLayerData(TextLayer.class, justificationLeft, "邻客秀智慧广告平台"));
newLayerDataByDisplayName.put(
"副标题", new NewLayerData(TextLayer.class, justificationLeft, "百业千屏 联动传播"));
// Load a PSD template file
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
// Look through layers and modify the necessary ones
for (Layer layer : psdImage.getLayers())
{
// Check whether the layer should be modified
NewLayerData newLayerData = newLayerDataByDisplayName.get(layer.getDisplayName());
if (newLayerData == null)
{
continue;
}
// Modify any text layer
if (layer instanceof TextLayer &&
newLayerData.layerType.isAssignableFrom(TextLayer.class))
{
TextLayer textLayer = (TextLayer)layer;
// Replace text and text alignment of the layer
ITextPortion[] items = textLayer.getTextData().getItems();
items[0].setText(newLayerData.text);
items[0].getParagraph().setJustification(newLayerData.justification);
// Apply the text changes to the text layer
textLayer.getTextData().updateLayerData();
}
// Modify other layer types...
}
// Save the modified PSD file as a PNG image
psdImage.save(outPngFilePath, new PngOptions());
}
finally
{
psdImage.dispose();
}
PSDJAVA-166. Fix saving PSD image with Grayscale ColorMode and 16 bit per channel to grayscale PSD format
/*
An examples of saving a PSD file that contains a grayscale image with a programmatically
added border around the image. After that the program tries to convert just saved PSD to PNG.
*/
String inPsdFilePath = "grayscale16bit.psd";
String outPngFilePath = "grayscale16bit_output.png";
String outPsdFilePath = "grayscale16bit_output.psd";
// Load a regular PSD file containing an image
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
RasterCachedImage rasterCachedImage = psdImage.getLayers()[0];
// Create a gray border around the image
Graphics graphics = new Graphics(rasterCachedImage);
int width = rasterCachedImage.getWidth();
int height = rasterCachedImage.getHeight();
Rectangle rectangle = new Rectangle(width / 3, height / 3,
width - (2 * (width / 3)) - 1, height - (2 * (height / 3)) - 1);
graphics.drawRectangle(new Pen(Color.getDarkGray(), 1), rectangle);
// Save the image in the grayscale color mode as a PSD file
PsdOptions psdOptions = new PsdOptions();
psdOptions.setColorMode(ColorModes.Grayscale);
psdOptions.setChannelBitsCount((short)16);
psdOptions.setChannelsCount((short)2);
psdImage.save(outPsdFilePath, psdOptions);
}
finally
{
psdImage.dispose();
}
// Load the previously saved PSD file containing a grayscale image
PsdImage psdImage1 = (PsdImage)Image.load(outPsdFilePath); // should be no exception
try
{
// Save the grayscale image as a PNG file with a white background
PngOptions pngOptions = new PngOptions();
pngOptions.setColorType(PngColorType.GrayscaleWithAlpha);
psdImage1.save(outPngFilePath, pngOptions);
}
finally
{
psdImage1.dispose();
}
PSDJAVA-167. Fix saving PSD image with Grayscale ColorMode and 16 bit per channel to PNG format
/*
An example of exporting a grayscale image from Photoshop document to PNG.
*/
String inPsdFilePath = "grayscale16bit.psd";
String outPngFilePath = "grayscale_output.png";
// Load a PSD file containing a grayscale image
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
// Save the grayscale image as a PNG file with a white background
PngOptions pngOptions = new PngOptions();
pngOptions.setColorType(PngColorType.GrayscaleWithAlpha);
psdImage.save(outPngFilePath, pngOptions);
}
finally
{
psdImage.dispose();
}
PSDJAVA-159. The GradientOverlayEffect.BlendMode property changes are not displayed in Photoshop
/*
An example of changing the blending mode for a gradient overlay effect.
*/
String inPsdFilePath = "psdnet585.psd";
String outPsdFilePath = "out_psdnet585.psd";
// Load a PSD file containing an image layer
PsdImage psdImage = (PsdImage)Image.load(inPsdFilePath);
try
{
GradientOverlayEffect gradientOverlayEffect =
psdImage.getLayers()[1].getBlendingOptions().addGradientOverlay();
// Change the blend mode for the gradient overlay effect
gradientOverlayEffect.setBlendMode(BlendMode.Subtract);
// Save a modified copy of loaded PSD file on the path
psdImage.save(outPsdFilePath);
}
finally
{
psdImage.dispose();
}