/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.chemistry.opencmis.inmemory.storedobj.impl; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import javax.imageio.ImageIO; import org.apache.chemistry.opencmis.commons.data.ContentStream; import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl; public class ImageThumbnailGenerator { private static final int DEFAULT_LENGTH = 100; private static final String RENDITION_MIME_TYPE = "image/jpeg"; private InputStream image; private int thumbWidth; private int thumbHeight; public ImageThumbnailGenerator(InputStream imageContent) { this.image = imageContent; } public int getWidth() { return thumbWidth; } public int getHeight() { return thumbHeight; } public ContentStream getRendition(int width, int height) { byte[] thumbnail; try { thumbnail = scaleImage(image, width, height); ContentStreamImpl cs = new ContentStreamImpl(); cs.setFileName("thumbnail.jpg"); cs.setMimeType(RENDITION_MIME_TYPE); cs.setStream(new ByteArrayInputStream(thumbnail)); cs.setLength(BigInteger.valueOf(thumbnail.length)); return cs; } catch (IOException e) { throw new CmisRuntimeException("Failed to generate thumbnail", e); } } private byte[] scaleImage(InputStream stream, int width, int height) throws IOException { BufferedImage resizedImage; BufferedImage originalImage = ImageIO.read(stream); if (width <= 0) { resizedImage = scaleLongerSideTo(originalImage, height); } else if (height <= 0) { resizedImage = scaleLongerSideTo(originalImage, width); } else { resizedImage = scaleImage(originalImage, width, height); } thumbWidth = resizedImage.getWidth(); thumbHeight = resizedImage.getHeight(); return storeImageinByteArray(resizedImage); } private BufferedImage scaleLongerSideTo(BufferedImage bi, int longerSideLengthParam) throws IOException { int width, height; int longerSideLength = longerSideLengthParam; if (longerSideLength <= 0) { longerSideLength = DEFAULT_LENGTH; } if (bi.getWidth() > bi.getHeight()) { width = longerSideLength; height = bi.getHeight() * longerSideLength / bi.getWidth(); } else { height = longerSideLength; width = bi.getWidth() * longerSideLength / bi.getHeight(); } BufferedImage resizedImage = scaleImage(bi, width, height); return resizedImage; } private BufferedImage scaleImage(BufferedImage originalImage, int width, int height) { BufferedImage resizedImage = new BufferedImage(width, height, originalImage.getType()); Graphics2D g = resizedImage.createGraphics(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawImage(originalImage, 0, 0, width, height, null); g.dispose(); g.setComposite(AlphaComposite.Src); return resizedImage; } private byte[] storeImageinByteArray(BufferedImage bi) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); boolean ok = ImageIO.write(bi, "JPG", os); if (ok) { return os.toByteArray(); } else { return null; } } }