ulrich
2022-02-11 ae1d6348242c3be10a38586c9d21f6187787e8cd
Stapelverarbeitung und Einschraenkung auf jpeg, jpg und png hinzugefuegt
2 files modified
1 files added
281 ■■■■■ changed files
src/de/uhilger/bildhelfer/Koordinator.java 33 ●●●●● patch | view | raw | blame | history
src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java 32 ●●●●● patch | view | raw | blame | history
src/de/uhilger/bildhelfer/Verkleinerer.java 216 ●●●● patch | view | raw | blame | history
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");
src/de/uhilger/bildhelfer/OrdnerVerarbeiter.java
New file
@@ -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());
      }
    }
  }
}
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");
    }
  }
}