From 671a35a1f6af8c5faa5f52e626e6ba3cdbab2b17 Mon Sep 17 00:00:00 2001 From: ulrich <not disclosed> Date: Sun, 04 Mar 2018 08:10:26 +0000 Subject: [PATCH] Verkleinern fuer Hochformat geaendert --- src/de/uhilger/wbx/Bild.java | 201 ++++++++++++++++++++++++++++++++++---------------- 1 files changed, 137 insertions(+), 64 deletions(-) diff --git a/src/de/uhilger/wbx/Bild.java b/src/de/uhilger/wbx/Bild.java index ab796e9..0e7aef7 100644 --- a/src/de/uhilger/wbx/Bild.java +++ b/src/de/uhilger/wbx/Bild.java @@ -14,8 +14,7 @@ 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; @@ -36,147 +35,221 @@ * Methoden zur Verkleinerung von Bildern */ public class Bild { - + public static final int WINZIG = 0; public static final int KLEIN = 1; public static final int SEMI = 2; public static final int MITTEL = 3; public static final int GROSS = 4; - + 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 + * @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 = getReducedImage(image, gr, gr, q, sh, false); + if (mimeType.contains("jpeg")) { + img = getReducedImage2(image, gr, gr, q, sh, false); } else { - img = getReducedImage(image, gr, gr, q, sh, true); + 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 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 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 { + 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; + int imageHeight = image.getHeight(null); + + int thumbWidth = width; + int thumbHeight = height; + if (imageWidth < width) { + thumbWidth = imageWidth; } - if(imageHeight < height) { + 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); - } + + 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); + // 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); + 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); + 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.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) - + 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")) { + if (mimeType.contains("jpg")) { imgType = "jpg"; - } else if(mimeType.contains("jpeg")) { + } else if (mimeType.contains("jpeg")) { imgType = "jpg"; - } else if(mimeType.contains("png")) { + } else if (mimeType.contains("png")) { imgType = "png"; - } else if(mimeType.contains("gif")) { + } 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); + return fileNameMap.getContentTypeFor("file://" + absName); } } -- Gitblit v1.9.3