From ca449ed86a46b676368fe0e1644e3828855318d0 Mon Sep 17 00:00:00 2001 From: ulrich <undisclosed> Date: Wed, 08 Mar 2017 06:41:27 +0000 Subject: [PATCH] Bildroutinen hinzugefuegt --- src/de/uhilger/wbx/Bild.java | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 174 insertions(+), 0 deletions(-) diff --git a/src/de/uhilger/wbx/Bild.java b/src/de/uhilger/wbx/Bild.java new file mode 100644 index 0000000..6765204 --- /dev/null +++ b/src/de/uhilger/wbx/Bild.java @@ -0,0 +1,174 @@ +/* + Dateiverwaltung - File management in your browser + Copyright (C) 2017 Ulrich Hilger, http://uhilger.de + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +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.net.FileNameMap; +import java.net.URLConnection; +import javax.imageio.ImageIO; + +/** + * Methoden zur Verkleinerung von Bildern + */ +public class Bild { + + public static final int WINZIG = 0; + public static final int KLEIN = 1; + public static final int MITTEL = 2; + public static final int GROSS = 3; + + public static final String[] GRNAME = {"-w", "-k", "-m", "-g"}; + public static final int[] GR = {120, 240, 700, 1200}; + + /** + * + * @param image + * @param gr + * @param mimeType + * @param oName Name der Originaldatei + * @param vName Name der verkleinerten Datei + * @throws InterruptedException + * @throws IOException + */ + public void writeImageFile(Image image, int gr, String mimeType, String oName, String vName) throws InterruptedException, IOException { + int q = 90; + float sh = 0.f; + //String mimeType = photo.getMimetype(); + BufferedImage img; + if(mimeType.contains("jpeg")) { + img = getReducedImage(image, gr, gr, q, sh, false); + } else { + img = getReducedImage(image, gr, gr, q, sh, true); + } + ImageIO.write(img, imgType(mimeType), new File(vName)); + } + + /** + * 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")) { + 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"; + } + return imgType; + } + + /** + * + * @param v Bild.WINZIG .. Bild.GROSS + * @return Länge der längsten Kante in Bildpunkten + */ + public int getVariantenGroesse(int v) { + return GR[v]; + } + + public String getVariantenName(int v) { + return GRNAME[v]; + } + + public String getMimeType(File file) { + String absName = file.getAbsolutePath(); + FileNameMap fileNameMap = URLConnection.getFileNameMap(); + return fileNameMap.getContentTypeFor("file://" + absName); + } +} -- Gitblit v1.9.3