net.sf.webphotos.tools.Thumbnail.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.webphotos.tools.Thumbnail.java

Source

/**
 * Copyright 2008 WebPhotos
 *
 * 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 net.sf.webphotos.tools;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import net.sf.webphotos.BancoImagem;
import net.sf.webphotos.util.Util;
import org.apache.commons.configuration.Configuration;

/**
 * Molda diferentes tamanhos de dimenso para as imagens. Controla os tamanhos
 * mximos de cada thumb e redimensiona o tamanho das fotos originais baseado
 * nesses valores mximos.
 */
public final class Thumbnail {

    // tam mximo de cada thumb
    private static int t1, t2, t3, t4;
    // marca dagua e texto aplicado ao thumbnail 4
    private static String marcadagua;
    private static String texto;
    private static int mdPosicao, mdMargem, mdTransparencia;
    private static String txFamilia;
    private static int txTamanho, txPosicao, txMargem, txEstilo;
    private static Color txCorFrente, txCorFundo;
    public static final String IMAGE_FORMAT = "jpg";

    /**
     * Busca no arquivo de configurao, classe
     * {@link net.sf.webphotos.util.Config Config}, os tamnahos dos 4 thumbs e
     * seta esses valores nas variveis desta classe. Testa se o usurio setou
     * valores de marca d'gua e texto para o thumb4, caso afirmativo, busca os
     * valores necessrios no arquivo de configurao.
     */
    private static void inicializar() {

        // le as configuraes do usurio
        Configuration c = Util.getConfig();

        // tamanhos de thumbnails
        t1 = c.getInt("thumbnail1");
        t2 = c.getInt("thumbnail2");
        t3 = c.getInt("thumbnail3");
        t4 = c.getInt("thumbnail4");

        // usuario setou marca d'agua para thumbnail 4 ?
        // TODO: melhorar teste para captao destes parametros
        try {
            marcadagua = c.getString("marcadagua");
            mdPosicao = c.getInt("marcadagua.posicao");
            mdMargem = c.getInt("marcadagua.margem");
            mdTransparencia = c.getInt("marcadagua.transparencia");
        } catch (Exception ex) {
            ex.printStackTrace(Util.err);
        }

        // usurio setou texto para o thumbnail 4 ?
        try {
            texto = c.getString("texto");
            txPosicao = c.getInt("texto.posicao");
            txMargem = c.getInt("texto.margem");
            txTamanho = c.getInt("texto.tamanho");
            txEstilo = c.getInt("texto.estilo");
            txFamilia = c.getString("texto.familia");

            String[] aux = c.getStringArray("texto.corFrente");
            txCorFrente = new Color(Integer.parseInt(aux[0]), Integer.parseInt(aux[1]), Integer.parseInt(aux[2]));
            aux = c.getStringArray("texto.corFundo");
            txCorFundo = new Color(Integer.parseInt(aux[0]), Integer.parseInt(aux[1]), Integer.parseInt(aux[2]));
        } catch (Exception ex) {
            ex.printStackTrace(Util.err);
        }

    }

    /**
     * Cria thumbs para as imagens. Testa se j existem valores setados para o
     * thumb, se no existir chama o mtodo
     * {@link net.sf.webphotos.Thumbnail#inicializar() inicializar} para setar
     * seus valores. Abre o arquivo de imagem passado como parmetro e checa se
     *  uma foto vlida. Obtm o tamanho original da imagem, checa se est no
     * formato paisagem ou retrato e utiliza o mtodo
     * {@link java.awt.Image#getScaledInstance(int,int,int) getScaledInstance}
     * para calcular os thumbs. Ao final, salva as imagens.
     *
     * @param caminhoCompletoImagem Caminho da imagem.
     */
    public static void makeThumbs(String caminhoCompletoImagem) {

        String diretorio, arquivo;
        if (t1 == 0) {
            inicializar();
        }

        try {
            File f = new File(caminhoCompletoImagem);
            if (!f.isFile() || !f.canRead()) {
                Util.err.println("[Thumbnail.makeThumbs]/ERRO: Erro no caminho do arquivo " + caminhoCompletoImagem
                        + " incorreto");
                return;
            }

            // Foto em alta corrompida 
            if (getFormatName(f) == null) {
                Util.err.println("[Thumbnail.makeThumbs]/ERRO: Foto Corrompida");
                return;
            } else {
                Util.out.println("[Thumbnail.makeThumbs]/INFO: Foto Ok!");
            }

            diretorio = f.getParent();
            arquivo = f.getName();

            ImageIcon ii = new ImageIcon(f.getCanonicalPath());
            Image i = ii.getImage();

            Image tumb1, tumb2, tumb3, tumb4;

            // obtm o tamanho da imagem original
            int iWidth = i.getWidth(null);
            int iHeight = i.getHeight(null);
            //int w, h;

            if (iWidth > iHeight) {
                tumb1 = i.getScaledInstance(t1, (t1 * iHeight) / iWidth, Image.SCALE_SMOOTH);
                tumb2 = i.getScaledInstance(t2, (t2 * iHeight) / iWidth, Image.SCALE_SMOOTH);
                tumb3 = i.getScaledInstance(t3, (t3 * iHeight) / iWidth, Image.SCALE_SMOOTH);
                tumb4 = i.getScaledInstance(t4, (t4 * iHeight) / iWidth, Image.SCALE_SMOOTH);
                //w = t4;
                //h = (t4 * iHeight) / iWidth;
            } else {
                tumb1 = i.getScaledInstance((t1 * iWidth) / iHeight, t1, Image.SCALE_SMOOTH);
                tumb2 = i.getScaledInstance((t2 * iWidth) / iHeight, t2, Image.SCALE_SMOOTH);
                tumb3 = i.getScaledInstance((t3 * iWidth) / iHeight, t3, Image.SCALE_SMOOTH);
                tumb4 = i.getScaledInstance((t4 * iWidth) / iHeight, t4, Image.SCALE_SMOOTH);
                //w = (t4 * iWidth) / iHeight;
                //h = t4;
            }

            tumb4 = estampar(tumb4);

            Util.log("Salvando Imagens");

            save(tumb1, diretorio + File.separator + "_a" + arquivo);
            save(tumb2, diretorio + File.separator + "_b" + arquivo);
            save(tumb3, diretorio + File.separator + "_c" + arquivo);
            save(tumb4, diretorio + File.separator + "_d" + arquivo);

        } catch (Exception e) {
            Util.err.println("[Thumbnail.makeThumbs]/ERRO: Inesperado - " + e.getMessage());
            e.printStackTrace(Util.err);
        }
    }

    private static Image estampar(Image im) {
        try {
            Image temp = new ImageIcon(im).getImage();

            BufferedImage buf = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
                    BufferedImage.TYPE_INT_RGB);

            Graphics2D g2 = (Graphics2D) buf.getGraphics();

            g2.drawImage(temp, 0, 0, null);
            g2.setBackground(Color.BLUE);

            Dimension dimensaoFoto = new Dimension(im.getWidth(null), im.getHeight(null));

            // aplicar texto
            if (texto != null) {
                Util.out.println("aplicando texto " + texto);

                Font fonte = new Font(txFamilia, txEstilo, txTamanho);
                g2.setFont(fonte);
                FontMetrics fm = g2.getFontMetrics(fonte);
                Dimension dimensaoTexto = new Dimension(fm.stringWidth(texto), fm.getHeight());
                Point posTexto = calculaPosicao(dimensaoFoto, dimensaoTexto, txMargem, txPosicao);

                g2.setPaint(txCorFundo);
                g2.drawString(texto, (int) posTexto.getX() + 1, (int) posTexto.getY() + 1 + fm.getHeight());
                g2.setPaint(txCorFrente);
                g2.drawString(texto, (int) posTexto.getX(), (int) posTexto.getY() + fm.getHeight());
            }

            // aplicar marca dagua
            if (marcadagua != null) {
                Image marca = new ImageIcon(marcadagua).getImage();
                int rule = AlphaComposite.SRC_OVER;
                float alpha = (float) mdTransparencia / 100;
                Point pos = calculaPosicao(dimensaoFoto, new Dimension(marca.getWidth(null), marca.getHeight(null)),
                        mdMargem, mdPosicao);

                g2.setComposite(AlphaComposite.getInstance(rule, alpha));
                g2.drawImage(marca, (int) pos.getX(), (int) pos.getY(), null);
            }

            g2.dispose();
            //return (Image) buf;
            return Toolkit.getDefaultToolkit().createImage(buf.getSource());
        } catch (Exception e) {
            Util.err.println("[Thumbnail.estampar]/ERRO: Inesperado - " + e.getMessage());
            e.printStackTrace(Util.err);
            return im;
        }
    }

    private static boolean save(Image thumbnail, String nmArquivo) {
        try {
            // This code ensures that all the
            // pixels in the image are loaded.
            Image temp = new ImageIcon(thumbnail).getImage();

            // Create the buffered image.
            BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
                    BufferedImage.TYPE_INT_RGB);

            // Copy image to buffered image.
            Graphics g = bufferedImage.createGraphics();

            // Clear background and paint the image.
            g.setColor(Color.white);
            g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
            g.drawImage(temp, 0, 0, null);
            g.dispose();

            // write the jpeg to a file
            File file = new File(nmArquivo);
            // Recria o arquivo se existir
            if (file.exists()) {
                Util.out.println("Redefinindo a Imagem: " + nmArquivo);
                file.delete();
                file = new File(nmArquivo);
            }

            // encodes image as a JPEG file
            ImageIO.write(bufferedImage, IMAGE_FORMAT, file);

            return true;
        } catch (IOException ioex) {
            ioex.printStackTrace(Util.err);
            return false;
        }
    }

    private static Point calculaPosicao(Dimension dimensaoExt, Dimension dimensaoInt, int margem, int posicao) {
        int x = 0, y = 0;
        // Posio da marca d'agua
        // 1---2---3 y1
        // 4---5---6 y2
        // 7---8---9 y3
        // x1  x2  x3
        int x1 = margem;
        int x2 = (int) ((float) (dimensaoExt.width - dimensaoInt.width) / 2);
        int x3 = dimensaoExt.width - dimensaoInt.width - margem;

        int y1 = margem;
        int y2 = (int) ((float) (dimensaoExt.height - dimensaoInt.height) / 2);
        int y3 = dimensaoExt.height - dimensaoInt.height - margem;

        if (posicao == 1) {
            x = x1;
            y = y1;
        } else if (posicao == 2) {
            x = x2;
            y = y1;
        } else if (posicao == 3) {
            x = x3;
            y = y1;
        } else if (posicao == 4) {
            x = x1;
            y = y2;
        } else if (posicao == 5) {
            x = x2;
            y = y2;
        } else if (posicao == 6) {
            x = x3;
            y = y2;
        } else if (posicao == 7) {
            x = x1;
            y = y3;
        } else if (posicao == 8) {
            x = x2;
            y = y3;
        } else if (posicao == 9) {
            x = x3;
            y = y3;
        }

        return new Point(x, y);
    }

    // Returns the format name of the image in the object 'o'.
    // 'o' can be either a File or InputStream object.
    // Returns null if the format is not known.
    private static String getFormatName(Object o) {
        try {
            // Create an image input stream on the image
            ImageInputStream iis = ImageIO.createImageInputStream(o);

            // Find all image readers that recognize the image format
            Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
            if (!iter.hasNext()) {
                // No readers found
                return null;
            }

            // Use the first reader
            ImageReader reader = iter.next();

            // Close stream
            iis.close();

            // Return the format name
            return reader.getFormatName();
        } catch (Exception e) {
            // The image could not be read
            return null;
        }
    }

    /**
     * Faz um load no arquivo de configurao e chama o mtodo
     * {@link net.sf.webphotos.Thumbnail#makeThumbs(String) makeThumbs} para
     * fazer thumbs de uma foto especfica.
     *
     * @param args args do mtodo main.
     */
    public static void main(String[] args) {
        makeThumbs("c:/temp/167.jpg");
        makeThumbs("d:/bancoImagem/81/312.jpg");
        makeThumbs("d:/bancoImagem/81/313.jpg");
        makeThumbs("d:/bancoImagem/81/314.jpg");
        makeThumbs("d:/bancoImagem/81/315.jpg");
        makeThumbs("D:/bancoImagem/460/2072.jpg");
        executaLote();
    }

    /**
     * Abre uma conexo com o banco de dados atravs da classe BancoImagem,
     * busca um lote de imagens e faz thumbs para todas as fotos. No possui
     * utilizaes.
     */
    public static void executaLote() {
        net.sf.webphotos.BancoImagem db = net.sf.webphotos.BancoImagem.getBancoImagem();

        try {
            db.configure("jdbc:mysql://localhost/test", "com.mysql.jdbc.Driver");
            BancoImagem.login();
            java.sql.Connection conn = BancoImagem.getConnection();
            java.sql.Statement st = conn.createStatement();
            java.sql.ResultSet rs = st.executeQuery("select * from fotos");

            int albumID, fotoID;
            String caminho;

            while (rs.next()) {
                albumID = rs.getInt("albumID");
                fotoID = rs.getInt("fotoID");
                caminho = "d:/bancoImagem/" + albumID + "/" + fotoID + ".jpg";
                makeThumbs(caminho);
                Util.out.println(caminho);
            }

            rs.close();
            st.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace(Util.err);
        }
    }
}