package com.shaneisrael.st.utilities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import com.shaneisrael.st.data.Logger;
public class ImageUtilities
{
public static Image image;
static boolean imageLoaded = false;
public static Image simpleBlur(Image img)
{
Image sourceImage = img;
// Create a buffered image from the source image with a format that's compatible with the screen
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
// If the source image has no alpha info use Transparency.OPAQUE instead
image = graphicsConfiguration.createCompatibleImage(sourceImage.getWidth(null), sourceImage.getHeight(null),
Transparency.BITMASK);
// Copy image to buffered image
Graphics graphics = ((BufferedImage) image).createGraphics();
// Paint the image onto the buffered image
graphics.drawImage(sourceImage, 0, 0, null);
graphics.dispose();
// A 3x3 kernel that blurs an image
Kernel kernel = new Kernel(3, 3, new float[] {
1f / 9f, 1f / 9f, 1f / 9f,
1f / 9f, 1f / 9f, 1f / 9f,
1f / 9f, 1f / 9f, 1f / 9f });
BufferedImageOp op = new ConvolveOp(kernel);
for (int i = 0; i < 2; i++)
{
image = op.filter((BufferedImage) image, null);
}
return image;
}
/**
* Compresses a BufferedImage down to the specified quality
*
* @param img
* the BufferedImage to be compressed
* @param quality
* The desired resulting image quality between 0.0 and 1f
*
* @return returns a new compressed BufferedImage
*/
public static BufferedImage compressImage(BufferedImage img, float quality)
{
File input = saveTemporarily(img);
try
{
BufferedImage image = ImageIO.read(input);
File compressedImageFile = new File("compress.jpg");
OutputStream os =new FileOutputStream(compressedImageFile);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.write(null, new IIOImage(image, null, null), param);
os.close();
ios.close();
writer.dispose();
image = ImageIO.read(compressedImageFile);
compressedImageFile.delete();
return image;
}
catch(IOException e)
{
Logger.Log(e);
e.printStackTrace();
}
return null;
}
/**
*
* @param image
* the BufferedImage create a temp file from
* @return
* returns a file path to a temporary file
*/
public static File saveTemporarily(BufferedImage image)
{
try
{
File file = File.createTempFile("stpp-", "-snip.png");
ImageIO.write(image, "png", file);
return file;
} catch (IOException e)
{
Logger.Log(e);
e.printStackTrace();
}
return null;
}
/**
*
* @param selections
* An array list of BufferedImages
* @return
* returns a combined image
*/
public static BufferedImage createMultiSnippet(ArrayList<BufferedImage> selections)
{
Graphics2D g2d;
BufferedImage result = null;
int maxWidth = 0;
int maxHeight = 0;
for(BufferedImage img : selections)
{
if(img.getWidth() > maxWidth)
maxWidth = img.getWidth();
maxHeight += img.getHeight();
}
result = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_RGB);
g2d = result.createGraphics();
g2d.setColor(Color.white);
g2d.fill(new Rectangle(maxWidth, maxHeight));
int y = 0;
for(BufferedImage img : selections)
{
g2d.drawImage(img, 0, y, null);
y+=img.getHeight();
}
g2d.dispose();
return result;
}
}