Browse our Products

Aspose.Imaging for Java 21.10 - Release notes

Competitive features:

  • Support Image scoped fonts
KeySummaryCategory
IMAGINGJAVA-7942Support Image scoped fontsFeature
IMAGINGJAVA-7950The trouble with Tiff file from the GIS teamEnhancement
IMAGINGJAVA-7949BUG - RasterImage.Filter GaussianFilterOptions Black pixel and border creationEnhancement
IMAGINGJAVA-7935Negative image height on converting WMF to PNGEnhancement
IMAGINGJAVA-7933Property Image.Size for eps images is not optimizedEnhancement
IMAGINGJAVA-7932Fix bugs in a figures fill colorEnhancement
IMAGINGJAVA-7930Fix bugs in CDR style reader for v14Enhancement
IMAGINGJAVA-7924Support of GetOriginalOptions for Gif, Jpeg2000 formatsEnhancement
IMAGINGJAVA-7918Exception when converting EMZ to JPGEnhancement
IMAGINGJAVA-7888Occasionally an exception occurs when running Image.save in multiple threadsEnhancement
IMAGINGJAVA-7885Exception saving WMF to JPEGEnhancement
IMAGINGJAVA-7876TIFF to PDF: Large output size PDFEnhancement

Public API changes:

Added APIs:

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

Removed APIs:

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

Usage Examples:

IMAGINGJAVA-7950 The trouble with Tiff file from the GIS team

HashMap<String, byte[]> map = new HashMap<String, byte[]>();
map.put("SentinelBand8A.tif", new byte[] { 25, 0, 0, 0, 0, 0, 31 });
map.put("SentinelNDVI.tif", new byte[] { (byte)221, (byte)150, 20, (byte)248, 63, (byte)169, (byte)202 });
map.put("PlanetNDVI.tif", new byte[] { 10, (byte)141, 60, 122, (byte)237, (byte)178, 103 });

for (Map.Entry<String, byte[]> entry : map.entrySet())
{
	String filename = entry.getKey();
	byte[] rawValues = entry.getValue();

	String baseFolder = "C:\\IMAGINGNET-4775\\";

	try(TiffImage image = (TiffImage)Image.load(baseFolder + filename))
	{
		Rectangle rawRect = new Rectangle(0, 0, image.getWidth(), image.getHeight());
		final RawDataSettings imageRawDataSettings = image.getRawDataSettings();

		RawDataSettings settings = new RawDataSettings();
		settings.setColorPalette(imageRawDataSettings.getColorPalette());
		settings.setDitheringMethod(imageRawDataSettings.getDitheringMethod());
		settings.setPixelDataFormat(imageRawDataSettings.getPixelDataFormat());
		settings.setCustomColorConverter(imageRawDataSettings.getCustomColorConverter());
		settings.setLineSize(imageRawDataSettings.getLineSize());
		settings.setIndexedColorConverter(imageRawDataSettings.getIndexedColorConverter());
		settings.setFallbackIndex(imageRawDataSettings.getFallbackIndex());

		RawTiffLoader loader = new RawTiffLoader();
		image.loadRawData(rawRect.Clone(), settings, loader);

		int[] indexes = new int[] { 0, 10, 100, 700, 800, 1000, 1200 };
		if (rawValues != null)
		{
			final byte[] buffer = loader.getBuffer();
			for (int i = 0; i < indexes.length; i++)
			{
				if (buffer[indexes[i]] != rawValues[i])
				{
					throw new AssertionError("Data must be equal!");
				}
			}
		}
	}
}

class RawTiffLoader implements IPartialRawDataLoader
{
    private byte[] buffer;
    public byte[] getBuffer() { return buffer; }

    public void process(Rectangle rectangle, byte[] data, Point start, Point end)
    {
        this.buffer = data;
    }

    public void process(Rectangle rectangle, byte[] data, Point start, Point end, LoadOptions loadOptions)
    {
        this.buffer = data;
    }
}

IMAGINGJAVA-7949 BUG - RasterImage.Filter GaussianFilterOptions Black pixel and border creation

import com.aspose.imaging.Image;
import com.aspose.imaging.RasterImage;
import com.aspose.imaging.imagefilters.filteroptions.GaussianBlurFilterOptions;



String baseFolder = "D:\\";
String inputFileName = baseFolder + "test_image.jpg";
String outFileName = baseFolder + "result.jpg";
try (RasterImage image = (RasterImage)Image.load(inputFileName))
{
     image.filter(image.getBounds(), new GaussianBlurFilterOptions(5, 5));
     image.save(outFileName);
}

IMAGINGJAVA-7942 Support Image scoped fonts

import com.aspose.imaging.*;
import com.aspose.imaging.customfonthandler.CustomFontData;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.imageoptions.VectorRasterizationOptions;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.LinkedList;
import java.util.List;


/*
   This example demonstrates the custom font source providing to use the specific font(s) for image rendering.
   Unlike FontSettings.setFontsFolders method works in the image scope and allowing to provide the fonts in multi-user scenarios.
*/
public void customFontSourceTest(String inputPath, String outputPath, String fileName, String fontPath)
{
	LoadOptions loadOptions = new LoadOptions();
	loadOptions.addCustomFontSource(new CustomFontSource()
	{
		@Override
		public CustomFontData[] get(Object... objects)
		{
			return getFontSource(objects);
		}
	}, fontPath);
	try (Image img = Image.load(inputPath + fileName, loadOptions))
	{
		final VectorRasterizationOptions vectorRasterizationOptions =
				(VectorRasterizationOptions) img.getDefaultOptions(new Object[]{Color.getWhite(), img.getWidth(), img.getHeight()});
		vectorRasterizationOptions.setTextRenderingHint(TextRenderingHint.SingleBitPerPixel);
		vectorRasterizationOptions.setSmoothingMode(SmoothingMode.None);

		img.save(outputPath + fileName + ".png", new PngOptions()
		{{
			setVectorRasterizationOptions(vectorRasterizationOptions);
		}});
	}
}

// The custom fonts provider example.
private CustomFontData[] getFontSource(Object... args)
{
	String fontsPath = "";
	if (args.length > 0)
	{
		fontsPath = args[0].toString();
	}

	List<CustomFontData> customFontData = new LinkedList<CustomFontData>();
	try
	{
		final File[] files = new File(fontsPath).listFiles();
		if (files != null)
		{
			for (File font : files)
			{
				customFontData.add(new CustomFontData(getNameNoExt(font.getName()), Files.readAllBytes(font.toPath())));
			}
		}
	}
	catch (IOException ex)
	{
		throw new RuntimeException(ex);
	}

	return customFontData.toArray(new CustomFontData[0]);
}

private String getNameNoExt(String fileName)
{
	int pos = fileName.lastIndexOf('.');
	if (pos < 0)
	{
		return fileName;
	}
	return fileName.substring(0, pos);
}

IMAGINGJAVA-7935 Negative image height on converting WMF to PNG

String dir = "C:\\Data\\";
final File[] files = new File(dir).listFiles();
if (files == null)
{
	return;
}
for (File file : files)
{
	if (!file.isFile() || file.getName().endsWith(".png"))
	{
		continue;
	}

	Image image = Image.load(file.getAbsolutePath());
	try
	{
		image.save(file.getAbsolutePath() + "-out.png", new PngOptions());
	}
	finally
	{
		image.close();
	}
}

IMAGINGJAVA-7933 Property Image.Size for eps images is not optimized

import com.aspose.imaging.Image;
import com.aspose.imaging.Size;


String inputFilePath = "file_2.eps";
for (int i = 0; i < 100; i++)
{
	try (Image image = Image.load(inputFilePath))
	{
		Size size = image.getSize();
        System.out.println(size);
	}
}

IMAGINGJAVA-7932 Fix bugs in a figures fill color

import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.CdrRasterizationOptions;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.imageoptions.PositioningTypes;


String baseFolder = "D:\\";
String fileName = "TestTransparent.cdr";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".png";
try (Image image = Image.load(inputFilePath))
{
	image.save(outputFilePath, new PngOptions()
	{{
		setVectorRasterizationOptions(new CdrRasterizationOptions()
		{{
			setPositioning(PositioningTypes.Relative);
		}});
	}});
}

IMAGINGJAVA-7930 Fix bugs in CDR style reader for v14

import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.CdrRasterizationOptions;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.imageoptions.PositioningTypes;


String baseFolder = "D:\\";
String fileName = "7 Band Spectrum Acrylic Tower Version 2.cdr";
String inputFilePath = baseFolder + fileName;
String outputFilePath = inputFilePath + ".png";
try (Image image = Image.load(inputFilePath))
{
	image.save(outputFilePath, new PngOptions()
	{{
		setVectorRasterizationOptions(new CdrRasterizationOptions()
		{{
			setPositioning(PositioningTypes.Relative);
		}});
	}});
}

IMAGINGJAVA-7924 Support of GetOriginalOptions for Gif, Jpeg2000 formats

String path = "source.gif";
String outputPath = "result.gif";
String outputPath2 = "result2.gif";
try (GifImage image = (GifImage)Image.load(path))
{
	image.save("result1.gif", image.getOriginalOptions());
	image.save("result2.gif", ((GifFrameBlock)image.getPages()[0]).getOriginalOptions());
}

IMAGINGJAVA-7918 Exception when converting EMZ to JPG

import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.JpegOptions;


String fileName = "image001.emz";
String baseFolder = "D:\\";
String inputFileName = baseFolder + fileName;
String outputFileName = inputFileName + ".jpg";
try (Image image = Image.load(inputFileName))
{
    image.save(outputFileName, new JpegOptions());
}

IMAGINGJAVA-7888 Occasionally an exception occurs when running Image.save in multiple threads

import com.aspose.imaging.*;
import com.aspose.imaging.imageoptions.*;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


Path inputDirPath = Paths.get ("C:\\Data\\input\\");
Path outputDirPath = Paths.get ("C:\\Data\\output\\");
int parallelThreadNum = 1;

// Repeat until error
for (int i = 0; i < 10; i++)
{
	convertFiles (inputDirPath, outputDirPath, parallelThreadNum);

	// If no error, clear output files.
	for (File outputFile: outputDirPath.toFile ().listFiles ()) {
		Files.delete (outputFile.toPath ());
	}
}

IMAGINGJAVA-7885 Exception saving WMF to JPEG

String inputFilePath = "1014094.wmf";
//String inputFilePath = "1109822.wmf";

String outputFilePath = inputFilePath + ".jpeg";

WmfRasterizationOptions rasterizationOptions = new WmfRasterizationOptions();
try
{
	convertVectorRasterizationTo(inputFilePath, outputFilePath, rasterizationOptions);
}
finally
{
	rasterizationOptions.close();
}

IMAGINGJAVA-7876 TIFF to PDF: Large output size PDF

String baseFolder = "D:\\";
String fileName = "Input.tif";
String inputFileName = baseFolder + fileName;
String outputFileName = inputFileName + ".pdf";
try (Image image = Image.load(inputFileName))
{
	final PdfCoreOptions pdfCoreOptions = new PdfCoreOptions();
	pdfCoreOptions.setCompression(PdfImageCompressionOptions.Ccitt4);

    image.save(outputFileName, new PdfOptions()
				{{
					  setPdfCoreOptions(pdfCoreOptions);
				}});
}