Aspose.Imaging for JAVA 20.8 - Release notes

Key Summary Category
IMAGINGJAVA-1786 Enhance EPS format support Feature
IMAGINGJAVA-1749 Support to load and convert EPS file PDF/A format Feature
IMAGINGJAVA-1747 Implement ability to create GraphicsPath from Path resources in TIFF image and vice versa Feature
IMAGINGJAVA-1795 Implement additional resize methods as per Aspose.Psd resize Enhancement
IMAGINGJAVA-1793 “File is corrupted or damaged” exception is thrown when rendering WMF file Enhancement
IMAGINGJAVA-1792 PSD exporter does not support compression methods Enhancement
IMAGINGJAVA-1791 Incorrect output when exporting to BMP with RLE compression Enhancement
IMAGINGJAVA-1790 Support of native export raster - HTML5 Canvas Enhancement
IMAGINGJAVA-1789 Black output after resizing PNG and saving to JPG Enhancement
IMAGINGJAVA-1788 WMF image is cut on right in exported PDF Enhancement
IMAGINGJAVA-1751 Exception on converting EPS Enhancement
IMAGINGJAVA-1748 Object reference not set to an instance of an object exception when saving JP2 Enhancement
IMAGINGJAVA-1744 Undefined function “if” exception when saving ODG Enhancement
IMAGINGJAVA-1742 WebPOptions.Quality property does not affect the degree of WebP image compression during export Enhancement
IMAGINGJAVA-1741 Exception on loading webp image Enhancement
IMAGINGJAVA-1740 Exception in LoadRawData on by pixel reading for TIFF Enhancement
IMAGINGJAVA-1739 Exception in LoadRawData on line by line reading for TIFF Enhancement
IMAGINGJAVA-1737 Support the clipping operation in VectorImageExporter Enhancement
IMAGINGJAVA-1736 Aspose.Imaging 20.3: Exception when trying to convert particular Emf to raster image Enhancement

Public API changes:

Added APIs:

Please see corresponding cumulative API changes for Aspose.Imaging for .NET 20.8 version

Removed APIs:

Please see corresponding cumulative API changes for Aspose.Imaging for .NET 20.8 version

Usage Examples:

IMAGINGJAVA-1795 Implement additional resize methods as per Aspose.Psd resize

### New Resize Types in Aspose.Imaging library
New resize types were implemented in *Aspose.Imaging* library:

**CatmullRom** - The Catmull-Rom cubic interpolation method.
**CubicConvolution** - The Cubic Convolution interpolation method.
**CubicBSpline** - The CubicBSpline cubic interpolation method.
**Mitchell** - The Mitchell cubic interpolation method.
**SinC** - The Sinc (Lanczos3) cubic interpolation method.
**Bell** - The Bell interpolation method.

### Resize image using specific Resize Type
The next source code sample demonstrates how you can use specific Resize Type to resize the image:

try (var image = Image.load("Photo.jpg"))
{
    image.resize(640, 480, ResizeType.CatmullRom);
    image.save("ResizedPhoto.jpg");

    image.resize(1024, 768, ResizeType.CubicConvolution);
    image.save("ResizedPhoto2.jpg");

    ImageResizeSettings resizeSettings = new ImageResizeSettings();
 resizeSettings.setMode(ResizeType.CubicBSpline);
 resizeSettings.setFilterType(ImageFilterType.SmallRectangular)

    image.resize(800, 800, resizeSettings);
    image.save("ResizedPhoto3.jpg");
}

IMAGINGJAVA-1793 “File is corrupted or damaged” exception is thrown when rendering WMF file

Without strict mode

String fileName = "GTK-ppt-fejlec-HU.wmf";
String baseFolder = "D:\\";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".png";
try (Image image = Image.load(inputFilePath))
{
 VectorRasterizationOptions vectorRasterizationOptions = new WmfRasterizationOptions();
 vectorRasterizationOptions.setBackgroundColor(Color.getTransparent());
 vectorRasterizationOptions.setPageWidth(image.getWidth());
 vectorRasterizationOptions.setPageHeight(image.getHeight());

 PngOptions pngOptions = new PngOptions();
 pngOptions.setColorType(PngColorType.TruecolorWithAlpha);
 pngOptions.setVectorRasterizationOptions(vectorRasterizationOptions);
 image.save(outputFilePath, pngOptions);
}


With strict mode

String fileName = "GTK-ppt-fejlec-HU.wmf";
String baseFolder = "D:\\";
String inputFilePath = baseFolder + fileName;
try
{
 final LoadOptions loadOptions = new LoadOptions();
 loadOptions.setDataRecoveryMode(DataRecoveryMode.None);
 try (Image image = Image.load(inputFilePath, loadOptions))
 {
 }

 throw new TestException("DataRecoveryMode is not worked");
}
catch (ImageLoadException exception)
{
 // Just skip it
}

IMAGINGJAVA-1792 PSD exporter does not support compression methods

// When exporting to PSD, options for compression, color type and bitness are available:

String SRC = "SRC";
try (Image image = Image.load(SRC))
{
 // Export to PSD with RLE compression
 final PsdOptions psdOptions = new PsdOptions();
 psdOptions.setCompressionMethod(CompressionMethod.RLE);
 
 image.save("DEST1", psdOptions);

 // Export to PSD with RGB color type
 psdOptions.setColorMode(ColorModes.Rgb);
 psdOptions.setChannelsCount((short) 3);
 psdOptions.setChannelBitsCount((short) 8);
 
 image.save("DEST2", psdOptions);

 // Export to PSD with ARGB color type
 psdOptions.setColorMode(ColorModes.Rgb);
 psdOptions.setChannelsCount((short) 4);
 psdOptions.setChannelBitsCount((short) 8);

 image.save("DEST3", psdOptions);

 // Export to PSD with Grayscale color type
 psdOptions.setColorMode(ColorModes.Grayscale);
 psdOptions.setChannelsCount((short) 1);
 psdOptions.setChannelBitsCount((short) 8);

 image.save("DEST4", psdOptions);

 // Export to PSD with Monochrome color type
 psdOptions.setColorMode(ColorModes.Bitmap);
 psdOptions.setChannelsCount((short) 1);
 psdOptions.setChannelBitsCount((short) 1);

 image.save("DEST5", psdOptions);

 // Export to PSD with Indexed color type
 psdOptions.setColorMode(ColorModes.Indexed);
 psdOptions.setChannelsCount((short) 1);
 psdOptions.setChannelBitsCount((short) 8);
 psdOptions.setPalette(ColorPaletteHelper.create8Bit());

 image.save("DEST6", psdOptions);
}

IMAGINGJAVA-1791 Incorrect output when exporting to BMP with RLE compression

try (Image image = Image.load("tiger.bmp"))
{
 final BmpOptions bmpOptions = new BmpOptions();
 bmpOptions.setCompression(BitmapCompression.Rle8);
 bmpOptions.setBitsPerPixel(8);
 bmpOptions.setPalette(ColorPaletteHelper.create8Bit());
 
 image.save("Rle8.bmp", bmpOptions);

 bmpOptions.setCompression(BitmapCompression.Rle4);
 bmpOptions.setBitsPerPixel(4);
 bmpOptions.setPalette(ColorPaletteHelper.create4Bit());

 image.save("Rle4.bmp", bmpOptions);
}

IMAGINGJAVA-1790 Support of native export raster - HTML5 Canvas

### Export raster image to HTML5 Canvas format
You can easily export any raster image (except animations) to HTML5 Canvas image format. The following code demonstrates the export to HTML5 Canvas format:

try (Image image = Image.load("tiger.bmp"))
{
    image.save("tiger.html", new Html5CanvasOptions());
}

IMAGINGJAVA-1789 Black output after resizing PNG and saving to JPG

try (Image image = Image.load("image01-100MB.png"))
{
    image.resize(600, 400);
    image.save("output.jpg", new JpegOptions());
}

IMAGINGJAVA-1788 WMF image is cut on right in exported PDF

String fileName = "Test2.wmf";
String baseFolder = "D:\\";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".pdf";

try (Image image = Image.load(inputFilePath))
{
 final PdfOptions pdfOptions = new PdfOptions();
 final WmfRasterizationOptions wmfOptions = new WmfRasterizationOptions();
 wmfOptions.setPageWidth(image.getWidth());
 wmfOptions.setPageHeight(image.getHeight());
 pdfOptions.setVectorRasterizationOptions(wmfOptions);
 
 image.save(outputFilePath, pdfOptions);
}

IMAGINGJAVA-1786 Enhance EPS format support

### What is EPS image format?

EPS file format is short for Encapsulated PostScript. It was
created by Adobe back in 1992. It?s a standard graphics file
format intended for placing images or drawings within a
PostScript Document. Basically it?s a postscript program saved
as a single file. EPS file also includes a low-resolution preview 
of the graphics inside which makes it accessible with programs
not capable of editing the script inside. EPS file format is
widely used by publishers because of its compatibility across
different operating systems.

An EPS file can contain any combination of text, graphics, and
images. Since it is actually a PostScript file, it is one of the most versatile file formats that are available. The files are
supported by several different drawing programs and vector graphic editing applications. Many image converter programs can
create EPS files containing the pixels of the image. An EPS file
is a stream of generic PostScript printing commands. Thus many
PostScript printer drivers have an option to save as EPS.

### The image preview

EPS files can optionally contain a bitmapped image preview so
that systems that can?t render PostScript directly can at least
 display a crude representation of what the graphic will look 
like. There are 4 preview formats: PICT, TIFF, Metafile and EPSI. 
It is also possible to have an EPS file without a preview, 
though. In this case, the imported file is usually displayed as a
grayed out box or a box with diagonal lines running through it.

The preview image has a fixed resolution, which is usually 72
dpi. If you enlarge an EPS file in a document, the preview image
is stretched and may become ?blocky? and lacking in detail. This
does not necessarily mean that the EPS-data themselves will
 degrade in quality. As long as the EPS-file only contains text
 and vector graphics, scaling it does not affect its quality. If
 you print a file containing an EPS-image on a non-PostScript
 printer, it is usually the preview image that gets printed. The
 preview image is ignored when you print to a PostScript device.


### Convert EPS image to PNG
The following code converts EPS image to PNG. The property 
**PreviewToExport** allows to select the source of the image to 
export from EPS file. The value **PostScriptRendering** of the
enumeration **EpsPreviewFormat** cause rendering from PostScript 
to raster image.

try (EpsImage image = (EpsImage)Image.load("Sample.eps"))
{
 PngOptions options = new PngOptions();
 EpsRasterizationOptions epsRasterizationOptions = new EpsRasterizationOptions();
 epsRasterizationOptions.setPageWidth(500); // Image width
 epsRasterizationOptions.setPageHeight(500);// Image height
 options.setVectorRasterizationOptions(epsRasterizationOptions);

 image.setPreviewToExport(EpsPreviewFormat.PostScriptRendering); // Render raster image using the PostScript
 image.save("Sample.png", options);
}

### Convert EPS to other formats
*Aspose.Imaging* library allows you to export EPS image to other
 formats. For that you just need to use corresponding Image
 options. The following code demonstrates how to export EPS image
 to PDF:

try (EpsImage image = (EpsImage)Image.load("Sample.eps"))
{
 PdfOptions options = new PdfOptions();
 final PdfCoreOptions pdfCoreOptions = new PdfCoreOptions();
 pdfCoreOptions.setPdfCompliance(PdfComplianceVersion.PdfA1b); // Set required PDF compliance
 options.setPdfCoreOptions(pdfCoreOptions);

 image.setPreviewToExport(EpsPreviewFormat.PostScriptRendering);
 image.save("Sample.pdf", options);
}

### Determine whether the EPS image has a preview
As we already discussed, EPS image can contain an encapsulated
 preview image. The following code shows how can you determine if
 the preview exists:

try (EpsImage image = (EpsImage)Image.load("Sample.eps"))
{
 if (image.hasRasterPreview())
 {
  System.out.println("The image has a raster preview.");
 }
}

### Export EPS preview image without PostScript rendering
There are several ways how can you export EPS preview image. The 
following code exports TIFF preview image:

try (EpsBinaryImage image = (EpsBinaryImage)Image.load("Sample.eps"))
{
 // Tiff image export options
 TiffOptions options = new TiffOptions(TiffExpectedFormat.TiffJpegRgb);

 // The first way:
 image.getTiffPreview().save("Sample1.tiff", options);

 // The second way:
 image.setPreviewToExport(EpsPreviewFormat.TIFF);
 image.save("Sample2.tiff", options);
}

IMAGINGJAVA-1751 Exception on converting EPS

### Convert EPS image to PNG
The following code converts EPS image to PNG. 
The property **PreviewToExport** allows to select the source of the image to export from EPS file. 
The value **PostScriptRendering** of the enumeration 
**EpsPreviewFormat** cause rendering from PostScript to raster image.

try (EpsImage image = (EpsImage)Image.load("Sample.eps"))
{
 PngOptions options = new PngOptions();
 final EpsRasterizationOptions epsOptions = new EpsRasterizationOptions();
 epsOptions.setPageWidth(500); // Image width
 epsOptions.setPageHeight(500); // Image height
 options.setVectorRasterizationOptions(epsOptions);

 image.setPreviewToExport(EpsPreviewFormat.PostScriptRendering); // Render raster image using the PostScript
 image.save("Sample.png", options);
}

IMAGINGJAVA-1749 Support to load and convert EPS file PDF/A format

### Convert EPS image to PDF
The following code demonstrates how to export EPS image to PDF:

try (EpsImage image = (EpsImage)Image.load("Sample.eps"))
{
 PdfOptions options = new PdfOptions();
 final PdfCoreOptions coreOptions = new PdfCoreOptions();
 coreOptions.setPdfCompliance(PdfComplianceVersion.PdfA1b); // Set required PDF compliance
 options.setPdfCoreOptions(coreOptions);
 
 image.setPreviewToExport(EpsPreviewFormat.PostScriptRendering); // Render raster image using the PostScript
 image.save("Sample.pdf", options);
}

IMAGINGJAVA-1748 Object reference not set to an instance of an object exception when saving JP2

### Exporting JP2 image as a PNG

The  images in the Jpeg2000 format can be saved as a PNG images using following code:


try (Image image = Image.load("sample.jp2"))
{
    PngOptions saveOptions = new PngOptions();

    image.save("sample.jp2.png", saveOptions);
}


Using JP2 file as in attachments, the example of the 
result of execution of this code can be seen 
in the attached "sample.jp2.png" file.

IMAGINGJAVA-1747 Implement ability to create GraphicsPath from Path resources in TIFF image and vice versa

### Create Graphics Path from Path Resources in TIFF image
You can use Path Resources in TIFF image to create a 
**GraphicsPath** class instance. The **GraphicsPath** can 
be used with **Graphics** class to draw on the image. 
The next source code sample shows how you can create the **GraphicsPath** instance 
and then draw a red line on the image:

try (TiffImage image = (TiffImage)Image.load("Bottle.tif"))
{
    // Create the GraphicsPath using PathResources from TIFF image
    GraphicsPath graphicsPath = PathResourceConverter.toGraphicsPath(image.getActiveFrame().getPathResources().toArray(new PathResource[0]),
            image.getActiveFrame().getSize());
    Graphics graphics = new Graphics(image);

    // Draw red line and save the image
    graphics.drawPath(new Pen(Color.getRed(), 10), graphicsPath);
    image.save("BottleWithRedBorder.tif");
}

### Create Path Resources using Graphics Path
Its also possible to create the Path Resources using Graphics Path. The next source code sample demonstrates how you can accomplish that:

static void main(String[] args)
{
 try (TiffImage image = (TiffImage)Image.load("Bottle.tif"))
 {
  // Create rectangular Figure for GraphicsPath
  Figure figure = new Figure();
  figure.addShape(createBezierShape(100f, 100f, 500f, 100f, 500f, 1000f, 100f, 1000f));

  // Create GraphicsPath using our Figure
  GraphicsPath graphicsPath = new GraphicsPath();
  graphicsPath.addFigure(figure);

  // Set PathResources using GraphicsPath
  PathResource[] pathResource = PathResourceConverter.fromGraphicsPath(graphicsPath, image.getSize());
  image.getActiveFrame().setPathResources(Arrays.asList(pathResource));

  // Save the image
  image.save("BottleWithRectanglePath.tif");
 }
}

private static BezierShape createBezierShape(float ... coordinates)
{
 PointF[] bezierPoints = coordinatesToBezierPoints(coordinates);
 return new BezierShape(bezierPoints, true);
}

private static PointF[] coordinatesToBezierPoints(float[] coordinates)
{
 PointF[] result = new PointF[coordinates.length / 2 * 3];

 int j = 0;
 for (int i = 0; i < coordinates.length - 1; i += 2)
 {
  result[j++] = new PointF(coordinates[i], coordinates[i+1]);
  result[j++] = new PointF(coordinates[i], coordinates[i+1]);
  result[j++] = new PointF(coordinates[i], coordinates[i+1]);
 }

 return result;
}

IMAGINGJAVA-1744 Undefined function “if” exception when saving ODG

String baseFolder = "D:\\";
String inputFile = "sample.odg";
String inputFileName = baseFolder + inputFile;
String outputFileName = inputFileName + ".png";
try (Image image = Image.load(inputFileName))
{
   OdgRasterizationOptions odgRasterizationOptions = new OdgRasterizationOptions();
   odgRasterizationOptions.setPageSize(Size.toSizeF(image.getSize()));
   PngOptions options = new PngOptions();
   options.setVectorRasterizationOptions(odgRasterizationOptions);
   image.save(outputFileName, options);
}

IMAGINGJAVA-1742 WebPOptions.Quality property does not affect the degree of WebP image compression during export

// Export GIF animation to WEBP with different compression quality
try (Image image = Image.load("test.gif"))
{
 // for lossless compression, increasing the quality setting increases the compression quality and decreases the file size
 WebPOptions webPOptions = new WebPOptions();
 webPOptions.setLossless(true);
 webPOptions.setQuality(20);
   
 image.save(
   "output_lossless_20.webp",
   webPOptions); // file size: 42 KB

 webPOptions.setLossless(true);
 webPOptions.setQuality(50);

 image.save(
   "output_lossless_50.webp",
   webPOptions); // file size: 41 KB

 webPOptions.setLossless(true);
 webPOptions.setQuality(80);

 image.save(
   "output_lossless_80.webp",
   webPOptions); // file size: 40 KB


 // for lossy compression, increasing the Quality value increases the image quality and increases the file size

 webPOptions.setLossless(false);
 webPOptions.setQuality(20);

 image.save(
   "output_lossy_20.webp",
   webPOptions); // file size: 24 KB

 webPOptions.setLossless(false);
 webPOptions.setQuality(50);

 image.save(
   "output_lossy_50.webp",
   webPOptions); // file size: 36 KB

 webPOptions.setLossless(false);
 webPOptions.setQuality(80);

 image.save(
   "output_lossy_80.webp",
   webPOptions); // file size: 51 KB
}

IMAGINGJAVA-1741 Exception on loading webp image

try (Image image = Image.load("failed_after_filter.wepb"))
{
    image.save("failed_after_filter.webp.png", new PngOptions());
}

IMAGINGJAVA-1740 Exception in LoadRawData on by pixel reading for TIFF

private static void readOnePixel()
{            
    License license = new License();
    license.setLicense("Conholdate.Total.lic");
    String file = "2by2.tif";
    try (TiffImage image = (TiffImage)Image.load(file))
    {
        for (int y = 0; i < image.getHeight(); y++)
        {
   for (int x = 0; i < image.getWidth(); x++)
    image.loadRawData(new Rectangle(x, y, 1, 1), image.getRawDataSettings(), new CustomRawDataLoader());
        }
    }
}

class CustomRawDataLoader implements IPartialRawDataLoader
{
    public void process(Rectangle rectangle, byte[] data, Point start, Point end)
    {
        this.process(rectangle, data, start, end, null);
    }

    public void process(Rectangle rectangle, byte[] data, Point start, Point end, LoadOptions loadOptions)
    {
  // Do everything you need
    }
}

IMAGINGJAVA-1739 Exception in LoadRawData on line by line reading for TIFF

private static void readLineByLine()
{            
    License license = new License();
    license.setLicense("Conholdate.Total.lic");
    String file = "raster50x50.tif";
    try (TiffImage image = (TiffImage)Image.load(file))
    {
        for (int i = 0; i < image.getHeight(); i++)
        {
            image.loadRawData(new Rectangle(0, i, image.getWidth(), 1), image.getRawDataSettings(), new CustomRawDataLoader());
        }
    }
}

class CustomRawDataLoader implements IPartialRawDataLoader
{
    public void process(Rectangle rectangle, byte[] data, Point start, Point end)
    {
        this.process(rectangle, data, start, end, null);
    }

    public void process(Rectangle rectangle, byte[] data, Point start, Point end, LoadOptions loadOptions)
    {
  // Here do everything you need with pixel's data
    }
}

IMAGINGJAVA-1737 Support the clipping operation in VectorImageExporter

WMF image format

try (Image image = Image.load("castle.wmf"))
{
    // saving a rectangular part of the image to a PNG file.
    Rectangle clipRect = new Rectangle(355, 9, 130, 177);
    PngOptions exportOptions = new PngOptions();
    final WmfRasterizationOptions wmfOptions = new WmfRasterizationOptions();
    wmfOptions.setPageWidth(200);
    wmfOptions.setPageHeight(200);
    exportOptions.setVectorRasterizationOptions(wmfOptions);
    image.save("castle.wmf_clip.png", exportOptions, clipRect);

    // setting the thickness of the outer borders
    wmfOptions.setBorderX(50);
    wmfOptions.setBorderY(25);
    image.save("castle.wmf_clip._border.png", exportOptions, clipRect);
}

IMAGINGJAVA-1736 Aspose.Imaging 20.3: Exception when trying to convert particular Emf to raster image

try (com.aspose.imaging.Image image = com.aspose.imaging.Image.load("mci-flow-PA3.emf"))
{
    EmfRasterizationOptions emfRasterizationOptions = new EmfRasterizationOptions();
    emfRasterizationOptions.setPageWidth(image.getWidth());
    emfRasterizationOptions.setPageHeight(image.getHeight());

    PngOptions options = new PngOptions();
    options.setVectorRasterizationOptions(emfRasterizationOptions);

    image.save("result.png", options);
}