Skip to content

Instantly share code, notes, and snippets.

@aspose-com-gists
Last active August 3, 2023 11:41
Show Gist options
  • Save aspose-com-gists/d8c86be526ab92ccc5eaafd1eaa1320b to your computer and use it in GitHub Desktop.
Save aspose-com-gists/d8c86be526ab92ccc5eaafd1eaa1320b to your computer and use it in GitHub Desktop.
HowTo : add merge images or photos feature to your java application or Web service.

Aspose.Imaging Java API allows easy implementation of merge images or photos feature in your java application or Web service.

You can:

  • consolidate several images into a single one;
  • create a photo collage;
  • produce one multi-page document from multiple pictures,

using one from the supported composite formats: PDF, TIFF, DICOM, or PSD.

Interested ?

You may go further at : https://products.aspose.com/imaging/java/

import com.aspose.imaging.Color;
import com.aspose.imaging.DisposableObject;
import com.aspose.imaging.IMultipageImage;
import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.CdrRasterizationOptions;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.imageoptions.PsdOptions;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
String dataDir = "c:\\Users\\USER\\Downloads\\templates\\";
List<Image> images = new ArrayList<>();
String[] files = {"template.cdr"};
ByteArrayOutputStream ms = new ByteArrayOutputStream(65535);
for (String fileName : files)
{
try (Image image = Image.load(dataDir + fileName))
{
IMultipageImage source = (IMultipageImage) image;
if (source != null)
{
for (Image page : source.getPages())
{
ms.reset();
page.save(ms, new PngOptions()
{{
setVectorRasterizationOptions(new CdrRasterizationOptions()
{{
setBackgroundColor(Color.getWhiteSmoke());
setPageWidth(image.getWidth());
setPageHeight(image.getHeight());
}});
}});
Image rasterImage = Image.load(new ByteArrayInputStream(ms.toByteArray()));
images.add(rasterImage);
}
}
}
}
if (images.isEmpty())
{
return;
}
String outputPath = dataDir + "result.psd";
try(Image image = Image.create(images.toArray(new Image[0])))
{
// Worry about Pdf ? That's it!
PsdOptions psdOptions = new PsdOptions();
image.save(outputPath, psdOptions);
}
// free memory
images.forEach(DisposableObject::close);
new File(outputPath).delete();
import com.aspose.imaging.IMultipageImage;
import com.aspose.imaging.Image;
import com.aspose.imaging.fileformats.tiff.enums.TiffExpectedFormat;
import com.aspose.imaging.imageoptions.TiffOptions;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// Test directory should have source images to merge
String TestDirectory = "D:\\Many2One\\";
List<Image> images = new ArrayList<Image>();
List<Image> pages = new ArrayList<Image>();
try
{
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(".tif") || name.endsWith(".tiff");
}
});
if (files == null)
{
return;
}
for (File file : files)
{
final Image image = Image.load(file.getAbsolutePath());
images.add(image);
if (image instanceof IMultipageImage)
{
Collections.addAll(pages, ((IMultipageImage) image).getPages());
}
}
if (pages.isEmpty())
{
return;
}
String outputPath = TestDirectory + "multipage.pdf";
try (Image image = Image.create(images.toArray(new Image[0])))
{
// Combine tiffs into one
TiffOptions tiffOptions = new TiffOptions(TiffExpectedFormat.TiffJpegRgb);
image.save(outputPath, tiffOptions);
}
}
finally
{
pages.clear();
for (Image image : images)
{
image.close();
}
images.clear();
}
import com.aspose.imaging.Image;
import com.aspose.imaging.RasterImage;
import com.aspose.imaging.fileformats.tiff.TiffFrame;
import com.aspose.imaging.fileformats.tiff.TiffImage;
import com.aspose.imaging.fileformats.tiff.enums.TiffExpectedFormat;
import com.aspose.imaging.imageoptions.PdfOptions;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.imageoptions.TiffOptions;
import java.io.File;
import java.io.FilenameFilter;
import java.util.HashMap;
import java.util.Map;
String TestDirectory = "<some directory>\\Many2One\\";
HashMap<String, Image> images = new HashMap<String, Image>();
try
{
String outputPath = TestDirectory + "output\\";
File dir = new File(outputPath);
assert dir.exists() || dir.mkdirs();
int maxWidth = 0;
int maxHeight = 0;
// Source file mask, could vary depending on image format (i.e. *.emf, *.wmf, *.svg, *.odg, etc)
final String fileMask = ".emf";
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(fileMask);
}
});
if (files == null)
return;
for (File fileName : files)
{
try (Image image = Image.load(fileName.getAbsolutePath()))
{
String outputFileName = outputPath + fileName.getName() + ".png";
// Save PNG image
image.save(outputFileName, new PngOptions());
Image rasterImage = Image.load(outputFileName);
if (rasterImage.getWidth() > maxWidth)
{
maxWidth = rasterImage.getWidth();
}
if (rasterImage.getHeight() > maxHeight)
{
maxHeight = rasterImage.getHeight();
}
images.put(outputFileName, rasterImage);
}
}
if (images.isEmpty())
{
return;
}
String outputPath1 = outputPath + "multiframe.tiff";
String outputPath2 = outputPath + "multipage.pdf";
final Image[] imageArray = images.values().toArray(new Image[0]);
try (TiffImage tiffImage = new TiffImage(new TiffFrame((RasterImage) imageArray[0])))
{
for (int i = 1; i < imageArray.length; i++)
{
tiffImage.addPage((RasterImage)imageArray[i]);
}
// Save as muti frame tiff
tiffImage.save(outputPath1, new TiffOptions(TiffExpectedFormat.TiffJpegRgb));
// Worry about Pdf ? That's it!
tiffImage.save(outputPath2, new PdfOptions());
}
}
finally
{
for (Map.Entry<String, Image> entry : images.entrySet())
{
entry.getValue().close();
new File(entry.getKey()).delete();
}
images.clear();
}
import com.aspose.imaging.DisposableObject;
import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.DicomOptions;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
String dataDir = "c:\\Users\\USER\\Downloads\\templates\\";
List<Image> images = new ArrayList<>();
String[] files = {"template.jpg", "template.jpg"};
for (String fileName : files)
{
Image image = Image.load(dataDir + fileName);
images.add(image);
}
String outputPath = dataDir + "result.dcm";
try (Image image = Image.create(images.toArray(new Image[0])))
{
image.save(outputPath, new DicomOptions());
}
images.forEach(DisposableObject::close);
new File(outputPath).delete();
import com.aspose.imaging.IMultipageImage;
import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.PdfOptions;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// Test directory should have source images to merge
String TestDirectory = "D:\\Many2One\\";
List<Image> images = new ArrayList<Image>();
List<Image> pages = new ArrayList<Image>();
try
{
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(".djvu");
}
});
if (files == null)
{
return;
}
for (File file : files)
{
final Image image = Image.load(file.getAbsolutePath());
images.add(image);
if (image instanceof IMultipageImage)
{
Collections.addAll(pages, ((IMultipageImage) image).getPages());
}
}
if (pages.isEmpty())
{
return;
}
String outputPath = TestDirectory + "multipage.pdf";
try (Image image = Image.create(images.toArray(new Image[0])))
{
// Worry about Pdf ? That's it!
PdfOptions pdfOptions = new PdfOptions();
image.save(outputPath, pdfOptions);
}
}
finally
{
pages.clear();
for (Image image : images)
{
image.close();
}
images.clear();
}
import com.aspose.imaging.IMultipageImage;
import com.aspose.imaging.Image;
import com.aspose.imaging.RasterImage;
import com.aspose.imaging.VectorImage;
import com.aspose.imaging.fileformats.tiff.TiffFrame;
import com.aspose.imaging.fileformats.tiff.TiffImage;
import com.aspose.imaging.fileformats.tiff.enums.TiffExpectedFormat;
import com.aspose.imaging.imageoptions.PdfOptions;
import com.aspose.imaging.imageoptions.TiffOptions;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
// Test directory should have source images to merge
String TestDirectory = "D:\\Many2One\\";
// Source file mask, could vary depending on image format (i.e. *.png, *.jpg, *.dicom, *., *.tiff, *.gif etc)
final String fileMask = ".png";
List<Image> singles = new ArrayList<Image>();
List<Image> images = new ArrayList<Image>();
try
{
int maxWidth = 0;
int maxHeight = 0;
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(fileMask);
}
});
if (files == null)
{
return;
}
for (File file : files)
{
Image image = Image.load(file.getAbsolutePath());
if (image.getWidth() > maxWidth)
{
maxWidth = image.getWidth();
}
if (image.getHeight() > maxHeight)
{
maxHeight = image.getHeight();
}
if (image instanceof VectorImage)
{
throw new UnsupportedOperationException("Vector images is not supported by these code snippet. Please look at vector to booklet example to get the implementation idea.");
}
if (image instanceof IMultipageImage)
{
Collections.addAll(singles, ((IMultipageImage) image).getPages());
}
else
{
singles.add(image);
}
images.add(image);
}
if (singles.isEmpty())
{
return;
}
String outputPath1 = TestDirectory + "multiframe.tiff";
String outputPath2 = TestDirectory + "multipage.pdf";
try (TiffImage tiffImage = new TiffImage(new TiffFrame((RasterImage) singles.get(0))))
{
for (int i = 1; i < singles.size(); i++)
{
tiffImage.addPage((RasterImage) singles.get(i));
}
// Save as muti frame tiff
tiffImage.save(outputPath1, new TiffOptions(TiffExpectedFormat.TiffJpegRgb));
// Worry about Pdf ? That's it!
tiffImage.save(outputPath2, new PdfOptions());
}
}
finally
{
singles.clear();
for (Image image : images)
{
image.close();
}
images.clear();
}
import com.aspose.imaging.Image;
import com.aspose.imaging.imageoptions.PdfOptions;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
// Test directory should have source images to merge
String TestDirectory = "D:\\Many2One\\";
List<Image> images = new ArrayList<Image>();
try
{
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(".jpg");
}
});
if (files == null)
{
return;
}
for (File file : files)
{
images.add(Image.load(file.getAbsolutePath()));
}
if (images.isEmpty())
{
return;
}
String outputPath = TestDirectory + "multipage.pdf";
try (Image image = Image.create(images.toArray(new Image[0])))
{
// Worry about Pdf ? That's it!
PdfOptions pdfOptions = new PdfOptions();
image.save(outputPath, pdfOptions);
}
}
finally
{
for (Image image : images)
{
image.close();
}
images.clear();
}
import com.aspose.imaging.Color;
import com.aspose.imaging.Graphics;
import com.aspose.imaging.Image;
import com.aspose.imaging.RectangleF;
import com.aspose.imaging.fileformats.png.PngColorType;
import com.aspose.imaging.imageoptions.PngOptions;
import com.aspose.imaging.sources.StreamSource;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
enum MergeStyle
{
Horizontal,
Vertical
}
// Test directory should have source images to merge
String TestDirectory = "D:\\Many2One\\";
MergeStyle mStyle = MergeStyle.Horizontal; // or MergeStyle.Vertical
List<Image> images = new ArrayList<Image>();
try
{
int totalWidth = 0;
int totalHeight = 0;
int maxWidth = 0;
int maxHeight = 0;
final String fileMask = ".png";
File[] files = new File(TestDirectory).listFiles(new FilenameFilter()
{
@Override
public boolean accept(File dir, String name)
{
return name.endsWith(fileMask);
}
});
if (files == null)
{
return;
}
for (File fileName : files)
{
try (Image image = Image.load(fileName.getAbsolutePath()))
{
totalWidth += image.getWidth();
if (image.getWidth() > maxWidth)
{
maxWidth = image.getWidth();
}
totalHeight += image.getHeight();
if (image.getHeight() > maxHeight)
{
maxHeight = image.getHeight();
}
images.add(image);
}
}
if (images.isEmpty())
{
return;
}
String mergeStyle;
int targetWidth, targetHeight;
if (mStyle == MergeStyle.Horizontal)
{
targetWidth = totalWidth;
targetHeight = maxHeight;
}
else if (mStyle == MergeStyle.Vertical)
{
targetWidth = maxWidth;
targetHeight = totalHeight;
}
else
{
return; // other merge styles are not supported
}
String outputPath = TestDirectory + "output\\";
File dir = new File(outputPath);
assert dir.exists() || dir.mkdirs();
outputPath = outputPath + "merged_" + mStyle.name() + ".png");
PngOptions pngOptions = new PngOptions();
pngOptions.setColorType(PngColorType.TruecolorWithAlpha);
pngOptions.setSource(new StreamSource());
try (Image image = Image.create(pngOptions, targetWidth, targetHeight))
{
image.setBackgroundColor(Color.getWhite());
final Graphics graphics = new Graphics(image);
float x = 0, y = 0;
for (Image it : images)
{
graphics.drawImage(it, new RectangleF(x, y, it.getWidth(), it.getHeight()));
if (mStyle == MergeStyle.Horizontal)
{
x += it.getWidth();
}
if (mStyle == MergeStyle.Vertical)
{
y += it.getHeight();
}
}
image.save(outputPath);
}
}
finally
{
for (Image image : images)
{
image.close();
}
images.clear();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment