package com.ajah.image;
/*
* Copyright 2012 Eric F. Savage, code@efsavage.com
*
* Licensed 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.
*/
import java.awt.Color;
import java.awt.color.CMMException;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import com.ajah.util.AjahUtils;
/**
* Utilities for processing images.
*
* @author <a href="http://efsavage.com">Eric F. Savage</a>, <a
* href="mailto:code@efsavage.com">code@efsavage.com</a>.
*/
public class ImageUtils {
private static Logger log = Logger.getLogger(ImageUtils.class.getName());
/**
* Blends two colors with a given alpha value.
*
* @param first
* The first color (subject to alpha).
* @param second
* The second color (subject to alpha remainder).
* @param alpha
* The alpha value of the blend.
* @return The blended color.
*/
public static Color blend(final Color first, final Color second, final float alpha) {
final int red = (int) ((first.getRed() * alpha) + second.getRed() * (1 - alpha));
final int green = (int) ((first.getGreen() * alpha) + second.getGreen() * (1 - alpha));
final int blue = (int) ((first.getBlue() * alpha) + second.getBlue() * (1 - alpha));
return new Color(red, green, blue);
}
/**
* Extracts some simple information about an image.
*
* @param data
* The image data.
* @return The image info bean.
* @throws IOException
* If the image could not be accessed.
* @throws CMMException
* If the image could not be analyzed.
*/
public static ImageInfo getInfo(final byte[] data) throws IOException, CMMException {
AjahUtils.requireParam(data, "data");
final BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));
if (image == null) {
throw new IllegalArgumentException("An image could not be constructed from the data");
}
final ImageInfo info = new ImageInfo();
info.setHeight(image.getHeight());
info.setWidth(image.getWidth());
try (final ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(data))) {
final Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
if (readers.hasNext()) {
info.setFormat(ImageFormat.from(readers.next().getFormatName()));
} else {
log.warning("No readers found for image");
}
}
return info;
}
}