package de.uhilger.bildhelfer;
|
|
import java.awt.Graphics2D;
|
import java.awt.Image;
|
import java.awt.RenderingHints;
|
import java.awt.image.BufferedImage;
|
import java.awt.image.ConvolveOp;
|
import java.awt.image.Kernel;
|
import java.awt.MediaTracker;
|
import java.awt.Container;
|
import java.io.File;
|
import java.io.FileNotFoundException;
|
import java.io.IOException;
|
import java.net.FileNameMap;
|
import java.net.URLConnection;
|
import java.util.logging.Level;
|
import java.util.logging.Logger;
|
import javax.imageio.ImageIO;
|
import javax.imageio.ImageWriter;
|
import javax.imageio.ImageWriteParam;
|
import javax.imageio.stream.FileImageOutputStream;
|
import javax.imageio.IIOImage;
|
|
class Verkleinerer {
|
|
private static final Logger logger = Logger.getLogger(Verkleinerer.class.getName());
|
|
void verkleinern(String[] args) {
|
int groesse = getIntFromArg(args[1], 1200);
|
float qualitaet = getFloatFromArg(args[2], (float) 0.7);
|
File eingangsOrdner = getFileFromArg(args[3]);
|
if(eingangsOrdner == null) {
|
logger.info("Eingangsordner konnte nicht bestimmt werden, Abbruch.");
|
return;
|
} else {
|
logger.info("Eingangsordner " + eingangsOrdner);
|
}
|
File ausgabeOrdner = getFileFromArg(args[4]);
|
if(ausgabeOrdner == null) {
|
logger.info("Ausgabeordner konnte nicht bestimmt werden, Abbruch.");
|
return;
|
} else {
|
logger.info("Ausgabeordner " + ausgabeOrdner);
|
}
|
dateienVerarbeiten(groesse, qualitaet, eingangsOrdner.getAbsolutePath(), ausgabeOrdner.getAbsolutePath());
|
}
|
|
private int getIntFromArg(String arg, int defaultValue) {
|
try {
|
int argValue = Integer.parseInt(arg);
|
logger.info("Ausgabegroesse " + argValue);
|
return argValue;
|
} catch(Exception ex) {
|
logger.info("Ausgabegroesse konnte nicht ermittelt werden, es wird der Standardwert " + defaultValue + " verwendet.");
|
return defaultValue;
|
}
|
}
|
|
private float getFloatFromArg(String arg, float defaultValue) {
|
try {
|
float argValue = Float.parseFloat(arg);
|
logger.info("Ausgabequalitaet " + argValue);
|
return argValue;
|
} catch(Exception ex) {
|
logger.info("Ausgabequalitaet konnte nicht ermittelt werden, es wird der Standardwert " + defaultValue + " verwendet.");
|
return defaultValue;
|
}
|
}
|
|
private File getFileFromArg(String arg) {
|
try {
|
File f = new File(arg);
|
if(!f.exists()) {
|
return null;
|
} else {
|
return f;
|
}
|
} catch(Exception ex) {
|
logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
|
return null;
|
}
|
}
|
|
|
private void dateienVerarbeiten(int gr, float quality, String inDirName, String outDirName) {
|
/*
|
Java-Code zum Verkleinern von Bildern
|
|
args[0] - Anzahl Pixel an der laengsten Kante
|
args[1] - qualitaet JPEG, z.B. 0.75 fuer 75% des Originals
|
args[2] - Eingangsordner
|
args[3] - Ausgabeordner
|
*/
|
|
FileNameMap fileNameMap = URLConnection.getFileNameMap();
|
//int width = Integer.parseInt(args[0]);
|
int width = gr;
|
int height = width;
|
//String inDirName = args[2];
|
//String outDirName = args[3];
|
File inFile = new File(inDirName);
|
File[] fileList = inFile.listFiles();
|
if(fileList != null && fileList.length > 0) {
|
for(int i = 0; i < fileList.length; i++) {
|
//System.out.println(fileList[i].getAbsolutePath());
|
|
File outDir = new File(outDirName);
|
File outFile = new File(outDir, fileList[i].getName());
|
//System.out.println(outFile.getAbsolutePath());
|
try {
|
Image image = ImageIO.read(fileList[i]);
|
MediaTracker mediaTracker = new MediaTracker(new Container());
|
mediaTracker.addImage(image, 0);
|
mediaTracker.waitForID(0);
|
if (!mediaTracker.isErrorAny()) {
|
|
//float quality = Float.parseFloat(args[1]);
|
float factor = (float) 0.0;
|
|
BufferedImage thumbImage;
|
int imageWidth = image.getWidth(null);
|
int imageHeight = image.getHeight(null);
|
int thumbWidth = width;
|
int thumbHeight = height;
|
if(imageWidth < width) {
|
thumbWidth = imageWidth;
|
}
|
if(imageHeight < height) {
|
thumbHeight = imageHeight;
|
}
|
double thumbRatio = (double)thumbWidth / (double)thumbHeight;
|
double imageRatio = (double)imageWidth / (double)imageHeight;
|
if (thumbRatio < imageRatio) {
|
thumbHeight = (int)(thumbWidth / imageRatio);
|
}
|
else {
|
thumbWidth = (int)(thumbHeight * imageRatio);
|
}
|
|
String mimeType = fileNameMap.getContentTypeFor("file://" + fileList[i].getAbsolutePath());
|
|
// draw original image to thumbnail image object and
|
// scale it to the new size on-the-fly
|
if(mimeType.contains("jpeg") || mimeType.contains("png")) {
|
thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
|
} else {
|
thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_ARGB);
|
}
|
Graphics2D graphics2D = thumbImage.createGraphics();
|
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
|
|
// 30.7.2007: sharpening hinzugefuegt (Anfang)
|
//float factor = -0.15f; // minus = sharpen, plus = soften
|
//float[] sharpenArray = {0, -1, 0, -1, 5, -1, 0, -1, 0};
|
/*
|
30.6.2013: sharpening als Weichmacher nur, wenn Bild < 400
|
*/
|
/*if(thumbWidth < 400 || thumbHeight < 400) {
|
factor = 0.1f;
|
}*/
|
|
if(factor != (float) 0.0) {
|
//float[] array = {0, factor, 0, factor, 1-(factor*4), factor, 0, factor, 0};
|
float[] array = new float[9];
|
array[0] = 0;
|
array[1] = factor;
|
array[2] = 0;
|
array[3] = factor;
|
array[4] = 1-(factor*4);
|
array[5] = factor;
|
array[6] = 0;
|
array[7] = factor;
|
array[8] = 0;
|
Kernel kernel = new Kernel(3, 3, array);
|
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
|
thumbImage = cOp.filter(thumbImage, null);
|
}
|
// 30.7.2007: sharpening hinzugefuegt (Ende)
|
|
String imgType;
|
if(mimeType.contains("jpg")) {
|
imgType = "jpg";
|
} else if(mimeType.contains("jpeg")) {
|
imgType = "jpg";
|
} else if(mimeType.contains("png")) {
|
imgType = "png";
|
} else if(mimeType.contains("gif")) {
|
imgType = "gif";
|
} else {
|
imgType = "jpg";
|
}
|
|
/*
|
14.1.2018: Ausgabe um Qualitaetsparameter erweitert
|
Beginn
|
*/
|
ImageWriter writer = ImageIO.getImageWritersByFormatName(imgType).next();
|
ImageWriteParam iwp = writer.getDefaultWriteParam();
|
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
iwp.setCompressionQuality(quality);
|
writer.setOutput(new FileImageOutputStream(outFile));
|
writer.write(null, new IIOImage(thumbImage, null, null), iwp);
|
writer.dispose();
|
/* 14.1.2018 Ende */
|
}
|
} catch (InterruptedException ex) {
|
//System.out.println("Error: " + ex.getLocalizedMessage());
|
} catch (FileNotFoundException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
} else {
|
//System.out.println("fileList is null or empty");
|
}
|
}
|
}
|