| /* | |
| * Copyright 2011 gitblit.com. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.gitblit.build; | |
| import java.awt.Dimension; | |
| import java.awt.Image; | |
| import java.awt.image.BufferedImage; | |
| import java.io.File; | |
| import java.io.FileOutputStream; | |
| import java.io.FilenameFilter; | |
| import java.io.IOException; | |
| import java.text.MessageFormat; | |
| import java.util.Iterator; | |
| import javax.imageio.ImageIO; | |
| import javax.imageio.ImageReader; | |
| import javax.imageio.stream.ImageInputStream; | |
| import com.beust.jcommander.JCommander; | |
| import com.beust.jcommander.Parameter; | |
| import com.beust.jcommander.ParameterException; | |
| import com.beust.jcommander.Parameters; | |
| /** | |
| * Generates PNG thumbnails of the PNG images from the specified source folder. | |
| * | |
| * @author James Moger | |
| * | |
| */ | |
| public class BuildThumbnails { | |
| public static void main(String[] args) { | |
| Params params = new Params(); | |
| JCommander jc = new JCommander(params); | |
| try { | |
| jc.parse(args); | |
| } catch (ParameterException t) { | |
| System.err.println(t.getMessage()); | |
| jc.usage(); | |
| } | |
| createImageThumbnail(params.sourceFolder, params.destinationFolder, params.maximumDimension); | |
| } | |
| /** | |
| * Generates thumbnails from all PNG images in the source folder and saves | |
| * them to the destination folder. | |
| * | |
| * @param sourceFolder | |
| * @param destinationFolder | |
| * @param maxDimension | |
| * the maximum height or width of the image. | |
| */ | |
| public static void createImageThumbnail(String sourceFolder, String destinationFolder, | |
| int maxDimension) { | |
| if (maxDimension <= 0) { | |
| return; | |
| } | |
| File source = new File(sourceFolder); | |
| File destination = new File(destinationFolder); | |
| destination.mkdirs(); | |
| File[] sourceFiles = source.listFiles(new FilenameFilter() { | |
| @Override | |
| public boolean accept(File dir, String name) { | |
| return name.toLowerCase().endsWith(".png"); | |
| } | |
| }); | |
| for (File sourceFile : sourceFiles) { | |
| File destinationFile = new File(destination, sourceFile.getName()); | |
| try { | |
| Dimension sz = getImageDimensions(sourceFile); | |
| int w = 0; | |
| int h = 0; | |
| if (sz.width > maxDimension) { | |
| // Scale to Width | |
| w = maxDimension; | |
| float f = maxDimension; | |
| // normalize height | |
| h = (int) ((f / sz.width) * sz.height); | |
| } else if (sz.height > maxDimension) { | |
| // Scale to Height | |
| h = maxDimension; | |
| float f = maxDimension; | |
| // normalize width | |
| w = (int) ((f / sz.height) * sz.width); | |
| } | |
| System.out.println(MessageFormat.format( | |
| "Generating thumbnail for {0} as ({1,number,#}, {2,number,#})", | |
| sourceFile.getName(), w, h)); | |
| BufferedImage image = ImageIO.read(sourceFile); | |
| Image scaledImage = image.getScaledInstance(w, h, BufferedImage.SCALE_SMOOTH); | |
| BufferedImage destImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); | |
| destImage.createGraphics().drawImage(scaledImage, 0, 0, null); | |
| FileOutputStream fos = new FileOutputStream(destinationFile); | |
| ImageIO.write(destImage, "png", fos); | |
| fos.flush(); | |
| fos.getFD().sync(); | |
| fos.close(); | |
| } catch (Throwable t) { | |
| t.printStackTrace(); | |
| } | |
| } | |
| } | |
| /** | |
| * Return the dimensions of the specified image file. | |
| * | |
| * @param file | |
| * @return dimensions of the image | |
| * @throws IOException | |
| */ | |
| public static Dimension getImageDimensions(File file) throws IOException { | |
| ImageInputStream in = ImageIO.createImageInputStream(file); | |
| try { | |
| final Iterator<ImageReader> readers = ImageIO.getImageReaders(in); | |
| if (readers.hasNext()) { | |
| ImageReader reader = readers.next(); | |
| try { | |
| reader.setInput(in); | |
| return new Dimension(reader.getWidth(0), reader.getHeight(0)); | |
| } finally { | |
| reader.dispose(); | |
| } | |
| } | |
| } finally { | |
| if (in != null) { | |
| in.close(); | |
| } | |
| } | |
| return null; | |
| } | |
| /** | |
| * JCommander Parameters class for BuildThumbnails. | |
| */ | |
| @Parameters(separators = " ") | |
| private static class Params { | |
| @Parameter(names = { "--sourceFolder" }, description = "Source folder for raw images", required = true) | |
| public String sourceFolder; | |
| @Parameter(names = { "--destinationFolder" }, description = "Destination folder for thumbnails", required = true) | |
| public String destinationFolder; | |
| @Parameter(names = { "--maximumDimension" }, description = "Maximum width or height for thumbnail", required = true) | |
| public int maximumDimension; | |
| } | |
| } |