WebBox Klassenbibliothek
ulrich
2018-03-04 35827a56037a583eabea82708a801b7fc3f6d355
Umgestellt auf Thumbnailator
2 files modified
225 ■■■■■ changed files
src/de/uhilger/wbx/Bild.java 186 ●●●●● patch | view | raw | blame | history
src/de/uhilger/wbx/web/TNServlet.java 39 ●●●●● patch | view | raw | blame | history
src/de/uhilger/wbx/Bild.java
@@ -17,25 +17,18 @@
 */
package de.uhilger.wbx;
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.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.FileNameMap;
import java.net.URLConnection;
import javax.imageio.ImageIO;
import java.util.logging.Logger;
/**
 * Methoden zur Verkleinerung von Bildern
 */
public class Bild {
  private static final Logger logger = Logger.getLogger(Bild.class.getName());
  public static final int WINZIG = 0;
  public static final int KLEIN = 1;
  public static final int SEMI = 2;
@@ -44,180 +37,7 @@
  public static final String[] GRNAME = {"-w", "-k", "-s", "-m", "-g"};
  public static final int[] GR = {120, 240, 500, 700, 1200};
  public void writeImageStream(Image image, int gr, String mimeType, OutputStream out) throws InterruptedException, IOException {
    ImageIO.write(getReducedImage(image, gr, mimeType), imgType(mimeType), out);
  }
  /**
   *
   * @param image
   * @param gr
   * @param mimeType
   * @param vName Name der verkleinerten Datei
   * @throws InterruptedException
   * @throws IOException
   */
  public void writeImageFile(Image image, int gr, String mimeType, String vName) throws InterruptedException, IOException {
    ImageIO.write(getReducedImage(image, gr, mimeType), imgType(mimeType), new File(vName));
  }
  private BufferedImage getReducedImage(Image image, int gr, String mimeType) throws InterruptedException, IOException {
    BufferedImage img;
    int q = 90;
    float sh = 0.f;
    if (mimeType.contains("jpeg")) {
      img = getReducedImage2(image, gr, gr, q, sh, false);
    } else {
      img = getReducedImage2(image, gr, gr, q, sh, true);
    }
    return img;
  }
  /**
   * Eine in Groesse und Qualitaet verringerte Bilddatei erzeugen
   *
   * @param image Ablageort und Name der Bilddatei
   * @param width neue Breite
   * @param height neue hoehe
   * @param quality neue Qualitaet (0 - 100)
   * @param factor Faktor fuer Schaerfe / Unschaerfe (z.B. -0.15f fuer leichte
   * Unschaerfe, 0.05f fuer leichtes Nachschaerfen)
   * @param withTransparency ob Transparenz benoetigt wird
   * @return neues, in Groesse und Qualitaet entsprechend verringertes Bild
   * @throws java.lang.InterruptedException
   * @throws java.io.FileNotFoundException
   */
  public BufferedImage getReducedImage2(Image image, int width, int height, int quality, float factor, boolean withTransparency)
          throws InterruptedException, FileNotFoundException, IOException {
    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(imageWidth > imageHeight) {
      // Querformat
      thumbHeight = (int) (thumbWidth / imageRatio);
    } else if(imageWidth == imageHeight) {
      // 1:1 kann so bleiben
    } else {
      // Hochformat
      thumbWidth = (int) (thumbHeight * imageRatio);
    }
    // draw original image to thumbnail image object and
    // scale it to the new size on-the-fly
    //BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
    BufferedImage thumbImage;
    if (withTransparency) {
      thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_ARGB);
    } else {
      thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
    }
    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 != 0.f) {
      float[] array = {0, factor, 0, factor, 1 - (factor * 4), factor, 0, factor, 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)
    return thumbImage;
  }
  
  /**
   * Eine in Groesse und Qualitaet verringerte Bilddatei erzeugen
   *
   * @param image Ablageort und Name der Bilddatei
   * @param width neue Breite
   * @param height neue hoehe
   * @param quality neue Qualitaet (0 - 100)
   * @param factor Faktor fuer Schaerfe / Unschaerfe (z.B. -0.15f fuer leichte
   * Unschaerfe, 0.05f fuer leichtes Nachschaerfen)
   * @param withTransparency ob Transparenz benoetigt wird
   * @return neues, in Groesse und Qualitaet entsprechend verringertes Bild
   * @throws java.lang.InterruptedException
   * @throws java.io.FileNotFoundException
   */
  public BufferedImage getReducedImage(Image image, int width, int height, int quality, float factor, boolean withTransparency)
          throws InterruptedException, FileNotFoundException, IOException {
    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);
    }
    // draw original image to thumbnail image object and
    // scale it to the new size on-the-fly
    //BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
    BufferedImage thumbImage;
    if (withTransparency) {
      thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_ARGB);
    } else {
      thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
    }
    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 != 0.f) {
      float[] array = {0, factor, 0, factor, 1 - (factor * 4), factor, 0, factor, 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)
    return thumbImage;
  }
  public String imgType(String mimeType) {
    String imgType;
    if (mimeType.contains("jpg")) {
src/de/uhilger/wbx/web/TNServlet.java
@@ -17,20 +17,15 @@
 */
package de.uhilger.wbx.web;
import de.uhilger.wbx.Bild;
import java.awt.Container;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.catalina.servlets.DefaultServlet;
/**
@@ -95,15 +90,15 @@
        
    if(uriStr.endsWith(JPG) || uriStr.endsWith(JPEG) || uriStr.endsWith(PNG)) {
      if(uriStr.contains(TN)) {
        bildAusgeben(request, response, relname, TN, Bild.WINZIG);
        bildAusgeben(request, response, relname, TN, 120);
      } else if(uriStr.contains(KL)) {
        bildAusgeben(request, response, relname, KL, Bild.KLEIN);
        bildAusgeben(request, response, relname, KL, 240);
      } else if(uriStr.contains(SM)) {
        bildAusgeben(request, response, relname, SM, Bild.SEMI);
        bildAusgeben(request, response, relname, SM, 500);
      } else if(uriStr.contains(MT)) {
        bildAusgeben(request, response, relname, MT, Bild.MITTEL);
        bildAusgeben(request, response, relname, MT, 700);
      } else if(uriStr.contains(GR)) {
        bildAusgeben(request, response, relname, GR, Bild.GROSS);
        bildAusgeben(request, response, relname, GR, 1200);
      } else {
        super.doGet(request, response);
      }      
@@ -112,22 +107,16 @@
    }
  }
  
  private void bildAusgeben(HttpServletRequest request, HttpServletResponse response, String relname, String indicator, int bildTyp) throws UnsupportedEncodingException, IOException {
  private void bildAusgeben(HttpServletRequest request, HttpServletResponse response, String relname, String indicator, int gr) throws UnsupportedEncodingException, IOException {
    File dir = new File(request.getServletContext().getRealPath("/"));
    relname = relname.replace(indicator, "");
    File imgfile = new File(dir, URLDecoder.decode(relname, "utf-8"));
    Image image = Toolkit.getDefaultToolkit().getImage(imgfile.getAbsolutePath());
    MediaTracker mediaTracker = new MediaTracker(new Container());
    mediaTracker.addImage(image, 0);
    try {
      mediaTracker.waitForID(0);
    // 120, 240, 500, 700, 1200
      if (!mediaTracker.isErrorAny()) {
        Bild bild = new Bild();
        bild.writeImageStream(image, bild.getVariantenGroesse(bildTyp), bild.getMimeType(imgfile), response.getOutputStream());
      }
    } catch (InterruptedException ex) {
      logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
    }
  }
    Thumbnails.of(imgfile)
            .size(gr, gr)
            .keepAspectRatio(true)
            .toOutputStream(response.getOutputStream());
  }
}