📄 imagegenerator.java
字号:
package com.blue.imageio;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.jimi.core.Jimi;
import com.sun.jimi.core.JimiException;
import com.sun.jimi.core.util.ColorReducer;
public class ImageGenerator {
public static final String MIME_PNG = "image/png";
public static final String MIME_GIF = "image/gif";
public static final String MIME_JPG = "image/jpeg";
/**
*
* @param sourceFile
* @param destFile
* @param newSize
* @param destMime
* @throws ImageException
*/
public static void generateImage(String sourceFile, String destFile, Size newSize, String destMime) throws ImageException {
try {
// read images. Here we read from files but it can be any source
// (internet, database etc.)
Image input = ImageIO.read(new FileInputStream(sourceFile));
Image output = ImageGenerator.generateImage(input, newSize, destMime);
// output the image datas into byteArray stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Jimi.putImage(MIME_PNG, output, baos);
byte[] data = baos.toByteArray();
// reload byteArray stream datas
ByteArrayInputStream bios = new ByteArrayInputStream(data);
BufferedImage imageOut = ImageIO.read(bios);
// write into specfied format.
String formatName = "";
if (destMime.equalsIgnoreCase(MIME_PNG))
formatName = "png";
else if (destMime.equalsIgnoreCase(MIME_GIF))
formatName = "gif";
else
formatName = "jpg";
ImageIO.write(imageOut, formatName, new File(destFile));
} catch (ImageException e) {
throw e;
} catch (JimiException e) {
throw new ImageException(e.getMessage());
} catch (IOException e) {
throw new ImageException(e.getMessage());
}
}
/**
*
* @param imgOrigin
* @param newSize
* @param destMime
* @return
* @throws ImageException
*/
public static Image generateImage(Image imgOrigin, Size newSize, String destMime) throws ImageException {
// Adjust target image size for output.
Size sizeSrc = new Size(imgOrigin.getWidth(null), imgOrigin.getHeight(null));
Size sizeCuted = new Size();
float srcRatio = (float) sizeSrc.getWidth() / (float) sizeSrc.getHeight();
float tgtRatio = (float) newSize.getWidth() / (float) newSize.getHeight();
if (srcRatio < tgtRatio) {
sizeCuted.setWidth(sizeSrc.getWidth());
sizeCuted.setHeight((int)((float)sizeSrc.getWidth() / tgtRatio));
} else {
sizeCuted.setWidth((int)((float)sizeSrc.getHeight() * tgtRatio));
sizeCuted.setHeight(sizeSrc.getHeight());
}
int cx = (sizeCuted.getWidth() - sizeSrc.getWidth()) / 2;
int cy = (sizeCuted.getHeight() - sizeSrc.getHeight()) / 5 * 2;
Image output = null;
try {
// Generate image that cut the border(s) if need.
Image cutedImage = new BufferedImage(sizeCuted.getWidth(), sizeCuted.getHeight(), BufferedImage.TYPE_INT_RGB);
cutedImage.getGraphics().drawImage(imgOrigin, cx, cy, null);
// Resizging.
output = new BufferedImage(newSize.getWidth(), newSize.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D bufferedImageContext = ((BufferedImage)output).createGraphics();
RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
AffineTransform affineTransform = AffineTransform.getScaleInstance((float) newSize.getWidth() / (float) sizeCuted.getWidth(), (float) newSize.getHeight() / (float) sizeCuted.getHeight());
bufferedImageContext.setRenderingHints(hints);
bufferedImageContext.drawImage(cutedImage, affineTransform, null);
// Octree arithmetic, transfer the image to 256 index color.
if (destMime.equals(MIME_PNG) || destMime.equals(MIME_GIF)) {
ColorReducer reducer = new ColorReducer(256, true);
output = reducer.getColorReducedImage(output);
}
} catch (JimiException e) {
throw new ImageException(e.getMessage());
}
return output;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -