Aspose.Imaging for Java 20.7 - Release notes

Key Summary Category
IMAGINGJAVA-1692 Support of convertion to 1 bitdepth PNG Feature
IMAGINGJAVA-1732 Incorrect image size after applying Crop/Resize/RotateFlipAll operations on Gif image with subsequent export to WebP Enhancement
IMAGINGJAVA-1705 Black output after resizing JPG Enhancement
IMAGINGJAVA-1710 Image saving failed exception when converting EMF Enhancement
IMAGINGJAVA-1708 WMF to PNG rasterization leads to empty black image Enhancement
IMAGINGJAVA-1716 Blank image when converting EMF to PNG on Linux Enhancement
IMAGINGJAVA-1713 Application never exits when converting EMF to SVG on Linux Enhancement
IMAGINGJAVA-1715 Application never exits when converting SVG to PNG/JPG on Linux Enhancement
IMAGINGJAVA-1711 Color information and left margin space is lost on exporting WMF to PDF Enhancement
IMAGINGJAVA-1689 Exception on rotating big TIFF/PNG/JPEG files Enhancement

Public API changes:

Added APIs:

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

Removed APIs:

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

Usage Examples:

IMAGINGJAVA-1713 Application never exits when converting EMF to SVG on Linux

Execute this example in Linux environment.

Image image = Image.load("sample.emf");
try
{
 SvgOptions saveOptions = new SvgOptions();
 EmfRasterizationOptions rasterizationOptions = new EmfRasterizationOptions()
 rasterizationOptions.setPageSize(Size.to_SizeF(image.getSize()));
 saveOptions.setVectorRasterizationOptions(rasterizationOptions);
 image.save("output.svg", saveOptions);
}
finally
{
 image.close();
}

IMAGINGJAVA-1732 Incorrect image size after applying Crop/Resize/RotateFlipAll operations on Gif image with subsequent export to WebP

// 1. Crop operation

public void TestCrop()
{
 String inputFile = "test.gif";
 String outputFile = "Crop.gif.webp";

 GifImage image = (GifImage)Image.load(inputFile);
 try
 {
 image.crop(new Rectangle(10, 10, 100, 100));
 image.save(outputFile, new WebPOptions());
 }
 finally
 {
 image.close();
 }

 WebPImage image2 = (WebPImage)Image.load(outputFile);
 try
 {
 Assert.assertEquals(100, image2.getHeight());
 Assert.assertEquals(100, image2.getWidth()); // Assertion failed! Expected 100, but was 322 (fixed)
 }
 finally
 {
 image2.close();
 }
}

// 2. Resize operation

public void TestResize()
{
 String inputFile = "test.gif";
 String outputFile = "Resize.gif.webp";

 GifImage image = (GifImage)Image.load(inputFile);
 try
 {
 image.resize(100, 150);
 image.save(outputFile, new WebPOptions());
 }
 finally
 {
 image.close();
 }

 WebPImage image2 = (WebPImage)Image.load(outputFile);
 try
 {
 Assert.assertEquals(150, image2.getHeight());
 Assert.assertEquals(100, image2.getWidth()); // Assertion failed! Expected 100, but was 322 (fixed)
 }
 finally
 {
 image2.close();
 }
}

// 3. RotateFlipAll operation

public void TestRotateFlipAll()
{
 String inputFile = "test.gif";
 String outputFile = "RotateFlipAll.gif.webp";
 Size initSize;

 GifImage image = (GifImage)Image.load(inputFile);
 try
 {
 initSize = image.getSize();
 image.rotateFlipAll(RotateFlipType.Rotate90FlipX);
 image.save(outputFile, new WebPOptions());
 }
 finally
 {
 image.close();
 }

 WebPImage image2 = (WebPImage)Image.load(outputFile);
 try
 {
 Assert.assertEquals(initSize.getWidth(), image2.getHeight()); // Assertion failed! Expected 478, but was 529 (fixed)
 Assert.assertEquals(initSize.getHeight(), image2.getWidth());
 }
 finally
 {
 image2.close();
 }
}

IMAGINGJAVA-1716 Blank image when converting EMF to PNG on Linux

Execute this example in Linux environment. Create font folder and add MerryChristmasFlake.ttf to folder.

FontSettings.setFontsFolder("font");
Image image = Image.load("sample.emf");
try
{
 PngOptions saveOptions = new PngOptions();
 EmfRasterizationOptions rasterizationOptions = new EmfRasterizationOptions()
 rasterizationOptions.setPageSize(Size.to_SizeF(image.getSize()));
 saveOptions.setVectorRasterizationOptions(rasterizationOptions);
 image.save("output.png", saveOptions);
}
finally
{
 image.close();
}

IMAGINGJAVA-1715 Application never exits when converting SVG to PNG/JPG on Linux

Execute this example in Linux environment.

FontSettings.setDefaultFontName("Arial");
Image image = Image.load("missing-font2.svg");
try
{
 image.save("output.png", new PngOptions());
}
finally
{
 image.close();
}

IMAGINGJAVA-1711 Color information and left margin space is lost on exporting WMF to PDF

String baseFolder = "D:\\";
String fileName = "Test1.wmf";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".pdf";
Image image = Image.load(inputFilePath);
try
{
 WmfRasterizationOptions rasterizationOptions = new WmfRasterizationOptions();
 rasterizationOptions.setPageSize(Size.to_SizeF(image.getSize()));

 PdfCoreOptions pdfCoreOptions = new PdfCoreOptions();
 pdfCoreOptions.setPdfCompliance(PdfComplianceCore.PdfA1a);

 PdfOptions options = new PdfOptions();
 options.setVectorRasterizationOptions(rasterizationOptions);
 options.setPdfCoreOptions(pdfCoreOptions);

 image.save(outputFilePath, options);
}
finally
{
 image.close();
}

IMAGINGJAVA-1710 Image saving failed exception when converting EMF

String baseFolder = "D:\\";
String file = "sample.emf";
String inputFileName = baseFolder + file;
String outputFileName = inputFileName + ".png";
Image image = Image.load(inputFileName);
try
{
 PngOptions options = new PngOptions();
 EmfRasterizationOptions rasterizationOptions = new EmfRasterizationOptions();
 rasterizationOptions.setPageSize(Size.to_SizeF(image.getSize()));
 options.setVectorRasterizationOptions(rasterizationOptions);
 image.save(outputFileName, options);
}
finally
{
 image.close();
}

IMAGINGJAVA-1708 20.5 WMF to PNG rasterization leads to empty black image

String fileName = "test.wmf";
String baseFolder = "D:\\";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".png";

Image image = Image.load(inputFilePath);
try
{
 PngOptions options = new PngOptions();
 WmfRasterizationOptions rasterizationOptions = new WmfRasterizationOptions();
 rasterizationOptions.setPageSize(Size.to_SizeF(image.getSize()));
 rasterizationOptions.setBackgroundColor(Color.getTransparent());
 options.setVectorRasterizationOptions(rasterizationOptions);
 options.setColorType(PngColorType.TruecolorWithAlpha);

 image.save(outputFilePath, options);
}
finally
{
 image.close();
}

IMAGINGJAVA-1705 Black output after resizing JPG

Image image = Image.load("image01-25MB.jpg");
try
{
 float opacity = ((RasterImage)image).getImageOpacity();
 Assert.assertEquals(opacity, 1f, 0.0000001f);
 image.resize(600, 400);
 image.save("resize.jpg");
}
finally
{
 image.close();
}

IMAGINGJAVA-1692 Converting to 1 bitdepth PNG results in black background

public void imagingJava1692Test()
{
 String inputFilePath = "00020.png";
 String outputFilePath = "00020_png.png";
 exportImage(inputFilePath, outputFilePath, FileFormat.Png, 0, null);
}

private static void exportImage(
  String sourceImageFilePath,
  String outputImageFilePath,
  long targetFormat,
  float rotateAngle,
  Integer rotateFlipType)
{
 LoadOptions options = new LoadOptions();
 options.setBufferSizeHint(450);
 RasterImage image = (RasterImage)Image.load(sourceImageFilePath, options);
 try
 {
  if (!image.isCached())
 {
  // !!! The caching call was in the customer example.
  // We strongly recommend that you do not use caching in this case,
  // since this leads to a noticeable decrease in performance in this case (in memory optimization strategy).
  image.cacheData();
 }

  if (rotateAngle != 0)
 {
  image.rotate(rotateAngle);
 }

  if (rotateFlipType != null)
 {
  image.rotateFlip(rotateFlipType);
 }

  int bitsPerPixel = image.getBitsPerPixel();
  int bitDepth = bitsPerPixel == 1 ? 1 : bitsPerPixel < 8 ? 8 : 24;

  ImageOptionsBase exportOptions;
  if (targetFormat == FileFormat.Jpeg)
 {
  if (bitDepth <= 8)
  {
   JpegOptions jpegOptions = new JpegOptions();
   jpegOptions.setPalette(ColorPaletteHelper.create8BitGrayscale(true));
   jpegOptions.setColorType(JpegCompressionColorMode.Grayscale);
   exportOptions = jpegOptions;
  }
  else
  {
   exportOptions = new JpegOptions();
  }
 }
  else if (targetFormat == FileFormat.Png)
 {
  PngOptions pngOptions = new PngOptions();
  pngOptions.setProgressive(false);
  if (bitDepth <= 8)
  {
   pngOptions.setColorType(PngColorType.Grayscale);
   pngOptions.setBitDepth((byte) bitDepth);
  }
  exportOptions = pngOptions;
 }
  else if (targetFormat == FileFormat.Tiff)
 {
  TiffOptions tiffOptions = new TiffOptions(TiffExpectedFormat.Default);
  exportOptions = tiffOptions;
  switch (bitDepth)
  {
   case 1:
   tiffOptions.setPhotometric(TiffPhotometrics.MinIsWhite);
   tiffOptions.setPalette(ColorPaletteHelper.createMonochrome());
   tiffOptions.setCompression(TiffCompressions.CcittFax4);
   tiffOptions.setBitsPerSample(new int[]{1});
   break;
   case 8:
   tiffOptions.setPhotometric(TiffPhotometrics.MinIsWhite);
   tiffOptions.setPalette(ColorPaletteHelper.create8BitGrayscale(true));
   tiffOptions.setCompression(TiffCompressions.Deflate);
   tiffOptions.setBitsPerSample(new int[]{8});
   break;
   default:
   int bitsPerSample = bitDepth / 3;
   tiffOptions.setPhotometric(TiffPhotometrics.Rgb);
   tiffOptions.setCompression(TiffCompressions.Jpeg);
   tiffOptions.setBitsPerSample(new int[]{bitsPerSample, bitsPerSample, bitsPerSample});
   break;
  }
 }
  else
 {
  return;
 }

  exportOptions.setBufferSizeHint(2056);
  exportOptions.setResolutionSettings(new ResolutionSetting(50, 50));

  image.save(outputImageFilePath, exportOptions);
 }
 finally
 {
  image.close();
 }
}

IMAGINGJAVA-1689 Exception on rotating big TIFF/PNG/JPEG files

public void ImagingJava1689Test()
{
 boolean useMemoryOptimization = true;
 String inputFilePath = "30mb.jpg";
 String outputFilePath1 ="30mb_jpg.jpg";
 exportImage(inputFilePath, outputFilePath1, FileFormat.Jpeg, 0, RotateFlipType.RotateNoneFlipX, useMemoryOptimization);
 String outputFilePath2 = "30mb_jpg.png";
 exportImage(inputFilePath, outputFilePath2, FileFormat.Png, 90, null, useMemoryOptimization);
 String outputFilePath3 = "30mb_jpg.tif";
 exportImage(inputFilePath, outputFilePath3, FileFormat.Tiff, 90, null, useMemoryOptimization);
}

private static void exportImage(
  String sourceImageFilePath,
  String outputImageFilePath,
  long targetFormat,
  float rotateAngle,
  Integer rotateFlipType,
  boolean useMemoryOptimization)
{

 LoadOptions loadOptions = new LoadOptions();
 loadOptions.setBufferSizeHint(useMemoryOptimization ? 450 : 0);

 RasterImage image = (RasterImage) Image.load(sourceImageFilePath, loadOptions);
 try
 {
  if (!image.isCached())
 {
  // !!! The caching call was in the customer example.
  // We strongly recommend that you do not use caching in this case,
  // since this leads to a noticeable decrease in performance in this case (in memory optimization strategy).
  image.cacheData();
 }

  if (rotateAngle != 0)
 {
  image.rotate(rotateAngle);
 }

  if (rotateFlipType != null)
 {
  image.rotateFlip(rotateFlipType);
 }

  int bitsPerPixel = image.getBitsPerPixel();
  int bitDepth = bitsPerPixel == 1 ? 1 : bitsPerPixel < 8 ? 8 : 24;

  ImageOptionsBase exportOptions;
  if (targetFormat == FileFormat.Jpeg)
 {
  if (bitDepth <= 8)
  {
   JpegOptions jpegOptions = new JpegOptions();
   jpegOptions.setPalette(ColorPaletteHelper.create8BitGrayscale(true));
   jpegOptions.setColorType(JpegCompressionColorMode.Grayscale);
   exportOptions = jpegOptions;
  }
  else
  {
   exportOptions = new JpegOptions();
  }
 }
  else if (targetFormat == FileFormat.Png)
 {
  PngOptions pngOptions = new PngOptions();
  pngOptions.setProgressive(false);
  if (bitDepth <= 8)
  {
   pngOptions.setColorType(PngColorType.Grayscale);
   pngOptions.setBitDepth((byte) bitDepth);
  }
  exportOptions = pngOptions;
 }
  else if (targetFormat == FileFormat.Tiff)
 {
  TiffOptions tiffOptions = new TiffOptions(TiffExpectedFormat.Default);
  exportOptions = tiffOptions;
  switch (bitDepth)
  {
   case 1:
   tiffOptions.setPhotometric(TiffPhotometrics.MinIsWhite);
   tiffOptions.setPalette(ColorPaletteHelper.createMonochrome());
   tiffOptions.setCompression(TiffCompressions.CcittFax4);
   tiffOptions.setBitsPerSample(new int[]{1});
   break;
   case 8:
   tiffOptions.setPhotometric(TiffPhotometrics.MinIsWhite);
   tiffOptions.setPalette(ColorPaletteHelper.create8BitGrayscale(true));
   tiffOptions.setCompression(TiffCompressions.Deflate);
   tiffOptions.setBitsPerSample(new int[]{8});
   break;
   default:
   int bitsPerSample = bitDepth / 3;
   tiffOptions.setPhotometric(TiffPhotometrics.Rgb);
   tiffOptions.setCompression(TiffCompressions.Jpeg);
   tiffOptions.setBitsPerSample(new int[]{bitsPerSample, bitsPerSample, bitsPerSample});
   break;
  }
 }
  else
 {
  return;
 }

  if (useMemoryOptimization)
 {
  exportOptions.setBufferSizeHint(2056);
 }

  exportOptions.setResolutionSettings(new ResolutionSetting(50, 50));

  image.save(outputImageFilePath, exportOptions);
 }
 finally
 {
  image.close();
 }
}