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()); logger.fine(fileList[i].getAbsolutePath()); File outDir = new File(outDirName); File outFile = new File(outDir, fileList[i].getName()); logger.info(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()); logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); } catch (FileNotFoundException e) { logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } catch (IOException e) { logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } } } else { logger.info("fileList is null or empty"); } } }