/******************************************************************************* * Copyright 2014 by E-Government Innovation Center EGIZ, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. ******************************************************************************/ package at.gv.egiz.pdfas.common.utils; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.common.settings.ISettings; public class ImageUtils { private static final Logger logger = LoggerFactory .getLogger(ImageUtils.class); public static BufferedImage removeAlphaChannel(BufferedImage src) { //if (src.getColorModel().hasAlpha()) { BufferedImage image = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics(); g.setComposite(AlphaComposite.Src); g.drawImage(src, 0, 0, null); g.dispose(); return image; //} //return src; /* * BufferedImage rgbImage = new BufferedImage(src.getWidth(), * src.getHeight(), BufferedImage.TYPE_3BYTE_BGR); for (int x = 0; x < * src.getWidth(); ++x) { for (int y = 0; y < src.getHeight(); ++y) { * rgbImage.setRGB(x, y, src.getRGB(x, y) & 0xFFFFFF); } } return * rgbImage; */ } public static BufferedImage convertRGBAToIndexed(BufferedImage src) { BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); Graphics g = dest.getGraphics(); g.setColor(new Color(231, 20, 189)); g.fillRect(0, 0, dest.getWidth(), dest.getHeight()); // fill with a // hideous color // and make it // transparent dest = makeTransparent(dest, 0, 0); dest.createGraphics().drawImage(src, 0, 0, null); return dest; } public static BufferedImage makeTransparent(BufferedImage image, int x, int y) { ColorModel cm = image.getColorModel(); if (!(cm instanceof IndexColorModel)) return image; // sorry... IndexColorModel icm = (IndexColorModel) cm; WritableRaster raster = image.getRaster(); int pixel = raster.getSample(x, y, 0); // pixel is offset in ICM's // palette int size = icm.getMapSize(); byte[] reds = new byte[size]; byte[] greens = new byte[size]; byte[] blues = new byte[size]; icm.getReds(reds); icm.getGreens(greens); icm.getBlues(blues); IndexColorModel icm2 = new IndexColorModel(8, size, reds, greens, blues, pixel); return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); } public static Dimension getImageDimensions(InputStream is) throws IOException { ImageInputStream in = ImageIO.createImageInputStream(is); try { final Iterator readers = ImageIO.getImageReaders(in); if (readers.hasNext()) { ImageReader reader = readers.next(); try { reader.setInput(in); return new Dimension(reader.getWidth(0), reader.getHeight(0)); } finally { reader.dispose(); } } throw new IOException("Failed to read Image file"); } finally { if (in != null) in.close(); } } public static File getImageFile(String imageFile, ISettings settings) throws PdfAsException, IOException { File img_file = new File(imageFile); if (!img_file.isAbsolute()) { logger.debug("Image file declaration is relative. Prepending path of resources directory."); logger.debug("Image Location: " + settings.getWorkingDirectory() + File.separator + imageFile); img_file = new File(settings.getWorkingDirectory() + File.separator + imageFile); } else { logger.debug("Image file declaration is absolute. Skipping file relocation."); } if (!img_file.exists()) { logger.debug("Image file \"" + img_file.getCanonicalPath() + "\" doesn't exist."); throw new PdfAsException("error.pdf.stamp.04"); } return img_file; } public static Dimension getImageDimensions(String imageValue, ISettings settings) throws PdfAsException, IOException { InputStream is = getImageInputStream(imageValue, settings); try { return getImageDimensions(is); } catch (Throwable e) { throw new PdfAsException("error.pdf.stamp.04", e); } finally { IOUtils.closeQuietly(is); } } public static InputStream getImageInputStream(String imageValue, ISettings settings) throws PdfAsException, IOException { InputStream is = null; try { File img_file = ImageUtils.getImageFile(imageValue, settings); if (!img_file.exists()) { throw new PdfAsException("error.pdf.stamp.04"); } is = new FileInputStream(img_file); } catch (PdfAsException | IOException e) { try { is = new ByteArrayInputStream(Base64.decodeBase64(imageValue)); } catch (Throwable e1) { // Ignore value is not base 64! logger.debug("Value is not base64: ", e1); // rethrow e throw e; } } return is; } public static BufferedImage getImage(String imageValue, ISettings settings) throws PdfAsException, IOException { InputStream is = getImageInputStream(imageValue, settings); try { return ImageIO.read(is); } catch (Throwable e) { throw new PdfAsException("error.pdf.stamp.04", e); } finally { IOUtils.closeQuietly(is); } } }