Java tutorial
package com.smash.revolance.ui.model.helper; /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Revolance-UI-Model * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Copyright (C) 2012 - 2013 RevoLance * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * This program 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. * * This program 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 this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * User: wsmash * Date: 27/01/13 * Time: 09:49 */ public class ImageHelper { private static final Map<File, Map<File, Boolean>> cache = new HashMap<File, Map<File, Boolean>>(); public static final String BASE64_IMAGE_PNG = "data:image/png;base64,"; public static BufferedImage cropImage(final BufferedImage img, int x, int y, int w, int h, double xScale, double yScale) { x = (int) (x * xScale); w = (int) (w * xScale); y = (int) (y * yScale); h = (int) (h * yScale); if (img.getHeight() < (y + h)) { h = img.getHeight() - y; } if (img.getWidth() < (x + w)) { w = img.getWidth() - x; } return img.getSubimage(x, y, w, h); } public static BufferedImage eraseRect(BufferedImage image, int x, int y, int w, int h, double xScale, double yScale) { x = (int) (x * xScale); w = (int) (w * xScale); y = (int) (y * yScale); h = (int) (h * yScale); Graphics2D g = image.createGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(x, y, w, h); g.dispose(); return image; } public static BufferedImage scaleImage(BufferedImage image, double widthPerCent, double heightPerCent) { int w = (int) (image.getWidth() * widthPerCent); int h = (int) (image.getHeight() * heightPerCent); int t = image.getType(); Image scaledImage = image.getScaledInstance(w, h, Image.SCALE_SMOOTH); BufferedImage newImg = new BufferedImage(w, h, t); newImg.getGraphics().drawImage(scaledImage, 0, 0, null); return newImg; } public static String encodeToString(BufferedImage image) throws IOException { String imageString = ""; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { Base64 encoder = new Base64(); ImageIO.write(image, "png", bos); byte[] bytes = bos.toByteArray(); imageString = BASE64_IMAGE_PNG + encoder.encodeToString(bytes); } finally { IOUtils.closeQuietly(bos); } return imageString; } public static BufferedImage decodeToImage(String imageString) throws Exception { imageString = imageString.split(BASE64_IMAGE_PNG)[1]; BufferedImage image = null; byte[] imageByte; Base64 decoder = new Base64(); imageByte = decoder.decode(imageString); ByteArrayInputStream bis = new ByteArrayInputStream(imageByte); try { image = ImageIO.read(bis); } finally { IOUtils.closeQuietly(bis); } return image; } public static boolean imgEquals(String imgRef, String img) throws IOException { File imgRefFile = new File(imgRef); File imgFile = new File(img); if (imgRefFile.exists() && imgFile.exists()) { return imgEquals(imgRefFile, imgFile); } else { return true; } } public static boolean imgEquals(File imgRef, File img) throws IOException { if (isCached(imgRef, img)) { return getComparisons(imgRef).get(img).booleanValue(); } else if (isCached(img, imgRef)) { return getComparisons(img).get(imgRef).booleanValue(); } else { BufferedImage refBI = ImageIO.read(imgRef); BufferedImage imgBi = ImageIO.read(img); int width = imgBi.getWidth(); int height = imgBi.getHeight(); if (refBI.getWidth() == width && refBI.getHeight() == height) { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int refIntensity = refBI.getRGB(x, y); int imgIntensity = imgBi.getRGB(x, y); if (refIntensity != imgIntensity) { getComparisons(imgRef).put(img, false); return false; } } } } getComparisons(imgRef).put(img, true); return true; } } /** * diff = (img2.rgb(x,y) != img1.rgb(x,y)) ? img1.rgb() : 0 * * @param img1 * @param img2 * @return * @throws IOException */ public static BufferedImage diffImg(BufferedImage img1, BufferedImage img2) throws IOException { int w = img1.getWidth(); int h = img1.getHeight(); int t = img1.getType(); BufferedImage diff = new BufferedImage(w, h, t); if (img1.getWidth() == img2.getWidth() && img1.getHeight() == img2.getHeight()) { for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { int refIntensity = img1.getRGB(x, y); int imgIntensity = img2.getRGB(x, y); if (refIntensity != imgIntensity) { diff.setRGB(x, y, imgIntensity); } else { diff.setRGB(x, y, 0); } } } } return diff; } private static boolean isCached(File imgRef, File img) { if (cache.containsKey(imgRef)) { Map<File, Boolean> comparisons = cache.get(imgRef); if (comparisons.containsKey(img)) { return true; } } return false; } private static Map<File, Boolean> getComparisons(File imgRef) { Map<File, Boolean> comparisons; if (cache.containsKey(imgRef)) { comparisons = cache.get(imgRef); } else { comparisons = new HashMap<File, Boolean>(); cache.put(imgRef, comparisons); } return comparisons; } }