All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jaeksoft.searchlib.util.ImageUtils Maven / Gradle / Ivy

Go to download

OpenSearchServer is a powerful, enterprise-class, search engine program. Using the web user interface, the crawlers (web, file, database, ...) and the REST/RESTFul API you will be able to integrate quickly and easily advanced full-text search capabilities in your application. OpenSearchServer runs on Windows and Linux/Unix/BSD.

The newest version!
/**   
 * License Agreement for OpenSearchServer
 *
 * Copyright (C) 2012-2014 Emmanuel Keller / Jaeksoft
 * 
 * http://www.open-search-server.com
 * 
 * This file is part of OpenSearchServer.
 *
 * OpenSearchServer is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 * OpenSearchServer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with OpenSearchServer. 
 *  If not, see .
 **/

package com.jaeksoft.searchlib.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import javax.swing.ImageIcon;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.imgscalr.Scalr;
import org.imgscalr.Scalr.Rotation;

import com.jaeksoft.searchlib.Logging;

public class ImageUtils {

	public static BufferedImage toBufferedImage(Image image)
			throws InterruptedException {

		if (image instanceof BufferedImage)
			return (BufferedImage) image;

		image = new ImageIcon(image).getImage();
		int type = hasAlpha(image) ? BufferedImage.TYPE_INT_ARGB
				: BufferedImage.TYPE_INT_RGB;
		BufferedImage bimage = new BufferedImage(image.getWidth(null),
				image.getHeight(null), type);
		Graphics g = bimage.createGraphics();
		g.drawImage(image, 0, 0, null);
		g.dispose();
		return bimage;
	}

	public static BufferedImage rotate(BufferedImage image, float degree)
			throws InterruptedException {

		Rotation rot = null;
		AffineTransformOp[] xform = null;

		switch ((int) degree) {
		case 90:
			rot = Rotation.CW_90;
			break;
		case 180:
			rot = Rotation.CW_180;
			break;
		case 270:
			rot = Rotation.CW_270;
			break;
		default:
			xform = new AffineTransformOp[1];
			xform[0] = new AffineTransformOp(
					AffineTransform.getRotateInstance(Math.toRadians(degree)),
					AffineTransformOp.TYPE_BICUBIC);
			break;
		}
		if (rot != null)
			return Scalr.rotate(image, rot, xform);
		return Scalr.apply(image, xform);
	}

	public static boolean hasAlpha(Image image) throws InterruptedException {
		if (image instanceof BufferedImage)
			return ((BufferedImage) image).getColorModel().hasAlpha();
		PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
		pg.grabPixels();
		return pg.getColorModel().hasAlpha();
	}

	public static void checkPlugins() {
		ImageIO.scanForPlugins();
		if (Logging.isDebug)
			for (String suffix : ImageIO.getReaderFileSuffixes())
				Logging.debug("ImageIO suffix: " + suffix);
	}

	public static ImageReader findImageReader(String formatName) {
		Iterator readers = ImageIO
				.getImageReadersByFormatName(formatName);
		ImageReader reader = null;
		while (readers.hasNext()) {
			reader = (ImageReader) readers.next();
			if (reader.canReadRaster())
				return reader;
		}
		return null;
	}

	public static final boolean checkIfManyColors(BufferedImage image) {
		int w = image.getWidth();
		int h = image.getHeight();
		if (w == 0 && h == 0)
			return false;
		int unicolor = image.getRGB(0, 0);
		for (int y = 0; y < h; y++) {
			for (int x = 0; x < w; x++) {
				int pixel = image.getRGB(x, y);
				if (pixel != unicolor)
					return true;
			}
		}
		return false;
	}

	public static final void yellowHighlight(Image image,
			Collection boxes, float outsetFactor) {
		if (CollectionUtils.isEmpty(boxes))
			return;
		Graphics2D g2d = (Graphics2D) image.getGraphics();
		g2d.setPaint(Color.YELLOW);
		Composite originalComposite = g2d.getComposite();
		AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
				0.3f);
		g2d.setComposite(ac);
		for (Rectangle box : boxes) {
			if (outsetFactor != 1.0F) {
				box = new Rectangle(box);
				box.grow((int) (box.getHeight() * outsetFactor),
						(int) (box.getWidth() * outsetFactor));
			}
			g2d.fill(box);
		}
		g2d.setComposite(originalComposite);
	}

	public static final String rectToCoordString(Rectangle box, char separator) {
		StringBuilder sb = new StringBuilder();
		sb.append(Integer.toString(box.x));
		sb.append(separator);
		sb.append(Integer.toString(box.y));
		sb.append(separator);
		sb.append(Integer.toString(box.x + box.width));
		sb.append(separator);
		sb.append(Integer.toString(box.y + box.height));
		return sb.toString();
	}

	public final static BufferedImage reduceImage(BufferedImage image,
			int width, int height) {
		int type = (image.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB
				: BufferedImage.TYPE_INT_ARGB;
		BufferedImage ret = (BufferedImage) image;
		int w = image.getWidth();
		int h = image.getHeight();

		while (w != width || h != height) {
			if (w > width) {
				w /= 2;
				if (w < width)
					w = width;
			}

			if (h > height) {
				h /= 2;
				if (h < height)
					h = height;
			}

			BufferedImage tmp = new BufferedImage(w, h, type);

			Graphics2D g2 = tmp.createGraphics();
			g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			g2.drawImage(ret, 0, 0, w, h, null);
			g2.dispose();
			ret = tmp;
		}
		return ret;
	}

	public final static BufferedImage reduceImage(BufferedImage image,
			int percent) {
		if (percent >= 100)
			return image;
		float fPercent = (float) percent / 100;
		float newWidth = (float) (image.getWidth()) * fPercent;
		float newHeight = (float) (image.getHeight()) * fPercent;
		return reduceImage(image, (int) newWidth, (int) newHeight);
	}

	public final static BufferedImage getSubimage(BufferedImage image, int x,
			int y, int width, int height) {
		if (width > image.getWidth() - x)
			width = image.getWidth() - x;
		if (height > image.getHeight() - y)
			height = image.getHeight() - y;
		return image.getSubimage(x, y, width, height);
	}

	public final static BufferedImage getSubImage(BufferedImage image,
			Rectangle rectangle) {
		return image.getSubimage(rectangle.x, rectangle.y, rectangle.width,
				rectangle.height);
	}

	public final static String computePHash(File file) {
		ImagePHash imgPhash = new ImagePHash();
		try {
			BufferedImage image = ImageIO.read(file);
			return imgPhash.getHash(image);
		} catch (IOException e) {
			Logging.warn(e);
			return null;
		}
	}

	public static Dimension getDimensions(File imageFile) throws IOException {
		FileImageInputStream fiis = null;
		try {
			fiis = new FileImageInputStream(imageFile);
			ImageReader imageReader = ImageIO.getImageReadersBySuffix(
					FilenameUtils.getExtension(imageFile.getName())).next();
			imageReader.setInput(fiis);
			return new Dimension(imageReader.getWidth(0),
					imageReader.getHeight(0));
		} finally {
			IOUtils.close(fiis);
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy