From ae1d6348242c3be10a38586c9d21f6187787e8cd Mon Sep 17 00:00:00 2001 From: ulrich Date: Fri, 11 Feb 2022 07:09:30 +0000 Subject: [PATCH] Stapelverarbeitung und Einschraenkung auf jpeg, jpg und png hinzugefuegt --- src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java | 32 ++++++ src/de/uhilger/bildhelfer/Verkleinerer.java | 216 ++++++++++++++++++++---------------------- src/de/uhilger/bildhelfer/Koordinator.java | 33 ++++++ 3 files changed, 167 insertions(+), 114 deletions(-) diff --git a/src/de/uhilger/bildhelfer/Koordinator.java b/src/de/uhilger/bildhelfer/Koordinator.java index e58044d..77cff37 100644 --- a/src/de/uhilger/bildhelfer/Koordinator.java +++ b/src/de/uhilger/bildhelfer/Koordinator.java @@ -1,7 +1,18 @@ package de.uhilger.bildhelfer; +import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; + + +/** + * Verkleinern von Bilddateien mit der Endung jpeg, jpg oder png + * + * Ausfuehren auf der Kommandozeile mit: + * java -jar liste + * java -jar verkleinern 1920 0.7 /media/extssd/Bildarchiv/Film /home/ulli/Bilder/film-1920 + * java -jar stapel 1920 0.7 /media/extssd/Bildarchiv/Film /home/ulli/Bilder/film-1920 + */ public class Koordinator { @@ -12,14 +23,32 @@ if(args[0].equals("verkleinern")) { verkleinern(args); } else if(args[0].equals("liste")) { - // TODO liste + System.out.println("Bilder in einzelnem Ordner verarbeiten:"); + System.out.println(" java -jar bildhelfer.jar verkleinern groesse qualitaet eingangsordner ausgabeordner"); + System.out.println("Ganze Ordnerstruktur mit Bildern verarbeiten:"); + System.out.println(" java -jar bildhelfer.jar stapel groesse qualitaet eingangsordner ausgabeordner"); + System.out.println("groesse: Anzahl Bildpunkte entlang der laengsten Kante als Ganzzahl"); + System.out.println("qualitaet: Prozentwert als Fliesskommazahl, z.B. 0.75 fuer 75%"); + } else if(args[0].equals("stapel")) { + stapelverarbeitung(args); } else { - logger.info("Fehlendes oder ungueltiges Kommando, gueltige Kommandos mit java -jar imagetool.jar liste"); + logger.info("Fehlendes oder ungueltiges Kommando. Gueltige Kommandos mit java -jar bildhelfer.jar liste"); } } } + private void stapelverarbeitung(String[] args) { + try { + System.out.println(args[0] + " " + args[1] + " " + args[2] + " " + args[3] + " " + args[4]); + OrdnerVerarbeiter ov = new OrdnerVerarbeiter(); + Verkleinerer v = new Verkleinerer(); + ov.verarbeiten(v, args[1], args[2], args[3], args[4]); + } catch (IOException ex) { + Logger.getLogger(Koordinator.class.getName()).log(Level.SEVERE, null, ex); + } + } + private void verkleinern(String[] args) { if(args.length < 5) { logger.info("Es muessen 4 Parameter sein: groesse, qualitaet, eingangsordner, ausgabeordner"); diff --git a/src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java b/src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java new file mode 100644 index 0000000..bed3bf5 --- /dev/null +++ b/src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java @@ -0,0 +1,32 @@ +package de.uhilger.bildhelfer; + +import java.io.File; +import java.io.IOException; + +/** + * + * @author ulli + */ +public class OrdnerVerarbeiter { + + public void verarbeiten(Verkleinerer v, String gr, String q, String eingabeOrdner, String ausgabeOrdner) throws IOException { + File ein = new File(eingabeOrdner); + File[] inhalt = ein.listFiles(); + for(int i = 0; i < inhalt.length; i++) { + String dateiname = inhalt[i].getName(); + if(inhalt[i].isDirectory()) { + System.out.println("Ordner " + dateiname); + String arbeitsOrdner = new File(ausgabeOrdner, dateiname).getAbsolutePath(); + File ziel = new File(arbeitsOrdner); + if(!ziel.exists()) { + ziel.mkdir(); + } + v.dateienVerarbeiten(v.getIntFromArg(gr, 1920), v.getFloatFromArg(q, (float) 0.7), inhalt[i].getAbsolutePath(), arbeitsOrdner); + verarbeiten(v, gr, q, inhalt[i].getAbsolutePath(), arbeitsOrdner); + } else { + //System.out.println("Datei " + inhalt[i].getName()); + } + } + } + +} diff --git a/src/de/uhilger/bildhelfer/Verkleinerer.java b/src/de/uhilger/bildhelfer/Verkleinerer.java index 414383d..e089be1 100644 --- a/src/de/uhilger/bildhelfer/Verkleinerer.java +++ b/src/de/uhilger/bildhelfer/Verkleinerer.java @@ -29,14 +29,14 @@ int groesse = getIntFromArg(args[1], 1200); float qualitaet = getFloatFromArg(args[2], (float) 0.7); File eingangsOrdner = getFileFromArg(args[3]); - if(eingangsOrdner == null) { + 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) { + if (ausgabeOrdner == null) { logger.info("Ausgabeordner konnte nicht bestimmt werden, Abbruch."); return; } else { @@ -45,23 +45,23 @@ dateienVerarbeiten(groesse, qualitaet, eingangsOrdner.getAbsolutePath(), ausgabeOrdner.getAbsolutePath()); } - private int getIntFromArg(String arg, int defaultValue) { + public int getIntFromArg(String arg, int defaultValue) { try { int argValue = Integer.parseInt(arg); logger.info("Ausgabegroesse " + argValue); return argValue; - } catch(Exception ex) { + } 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) { + public float getFloatFromArg(String arg, float defaultValue) { try { float argValue = Float.parseFloat(arg); logger.info("Ausgabequalitaet " + argValue); return argValue; - } catch(Exception ex) { + } catch (Exception ex) { logger.info("Ausgabequalitaet konnte nicht ermittelt werden, es wird der Standardwert " + defaultValue + " verwendet."); return defaultValue; } @@ -70,27 +70,26 @@ private File getFileFromArg(String arg) { try { File f = new File(arg); - if(!f.exists()) { + if (!f.exists()) { return null; } else { return f; } - } catch(Exception ex) { + } catch (Exception ex) { logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); return null; } } - - private void dateienVerarbeiten(int gr, float quality, String inDirName, String outDirName) { -/* + public 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[1] - qualitaet, z.B. 0.75 fuer 75% des Originals args[2] - Eingangsordner args[3] - Ausgabeordner -*/ + */ FileNameMap fileNameMap = URLConnection.getFileNameMap(); //int width = Integer.parseInt(args[0]); @@ -100,8 +99,8 @@ //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++) { + 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()); @@ -109,102 +108,99 @@ File outDir = new File(outDirName); File outFile = new File(outDir, fileList[i].getName()); logger.info(outFile.getAbsolutePath()); + String fname = fileList[i].getName().toLowerCase(); try { - Image image = ImageIO.read(fileList[i]); - MediaTracker mediaTracker = new MediaTracker(new Container()); - mediaTracker.addImage(image, 0); - mediaTracker.waitForID(0); - if (!mediaTracker.isErrorAny()) { + if (fileList[i].isFile() && (fname.endsWith("jpg") || fname.endsWith("jpeg") || fname.endsWith("png"))) { + 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); + } - BufferedImage thumbImage; - int imageWidth = image.getWidth(null); - int imageHeight = image.getHeight(null); - int thumbWidth = width; - int thumbHeight = height; - if(imageWidth < width) { - thumbWidth = imageWidth; + 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); + + //float quality = Float.parseFloat(args[1]); + float factor = (float) 0.0; + // 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 } - 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()); @@ -215,13 +211,9 @@ logger.log(Level.SEVERE, e.getLocalizedMessage(), e); } } + } else { logger.info("fileList is null or empty"); } } } - - - - - -- Gitblit v1.9.3