From 23a283834becf8323489231ed5c48725f9716bb6 Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Wed, 25 Feb 2015 12:50:41 +0100 Subject: fixed base64 image value --- .../at/gv/egiz/pdfas/common/utils/ImageUtils.java | 139 ++++++++++++++------- 1 file changed, 95 insertions(+), 44 deletions(-) (limited to 'pdf-as-common/src/main/java/at/gv/egiz/pdfas/common') diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/ImageUtils.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/ImageUtils.java index dcf1f17b..ab087f2c 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/ImageUtils.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/utils/ImageUtils.java @@ -32,7 +32,9 @@ 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; @@ -41,6 +43,8 @@ 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; @@ -48,33 +52,30 @@ 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; - } + 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;*/ + * 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); @@ -110,46 +111,96 @@ public class ImageUtils { return new BufferedImage(icm2, raster, image.isAlphaPremultiplied(), null); } - - public static Dimension getImageDimensions(InputStream is) throws IOException { + + 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"); + 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(); + if (in != null) + in.close(); } } - - public static File getImageFile(String imageFile, ISettings settings) throws PdfAsException, IOException { + + 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() + 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() + 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); + } + } } -- cgit v1.2.3