Olá Pessoal…
meu nome é Alberto, sou aluno de computação em João Pessoa - PB
estou começando a usar o PostgreSQL agora e preciso fazer uma aplicação para armazenar imagens e ver essas imagens numa aplicação JSP.
vi o artigo: http://www.imasters.com.br/artigo/1779.
Gostaria de saber se pode me ajudar com isso? a aplicação tem mais de 4 mil fotos e pelo que li, devo usar campo BYTEA.
Quando fizer um Select, será necessário gerar a foto numa pasta temporária?
Qual a melhor solução pra inserir 4 mil fotos, armazenar em banco ou em diretórios?
Pode me ajudar? me indicar um bom material para aprender? mostrar uns exemplos?
Desda já agradeço… muito obrigado!
[]'s Alberto Ivo
Qual o tamanho das imagens? Eu deixo as minhas no banco, o meu software as converte para PNG, faz compressão, e depois armazena.
Na minha classe de modelo, o campo "foto" é do tipo Image, mas para gravar em banco é preciso converter para um vetor de byte. Não sei se Blob ou Clob funcionam, mas acredito que sim, e provavelmente de um jeito mais fácil… Segue o código pra converter imagens pra byte array, e vice-versa:
/**
* ImageUtils.java
*/
package br.esfera.desktop.util;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.ByteBuffer;
/**
*
* @author rodrigogh
*/
public final class ImageUtils {
// 5 x 7 cm
static final int IMG_WIDTH = 142;
static final int IMG_HEIGHT = 198;
public static BufferedImage loadImage(File file) {
BufferedImage image = null;
try {
image = ImageIO.read(file);
if ( image.getWidth() != IMG_WIDTH || image.getHeight() != IMG_HEIGHT )
image = scale(image);
return image;
} catch (Exception e) {
e.printStackTrace();
} finally {
return image;
}
}
public static BufferedImage loadImage(String filePath) {
BufferedImage image = null;
try {
image = ImageIO.read(ImageUtils.class.getResourceAsStream(filePath));
if ( image.getWidth() != IMG_WIDTH || image.getHeight() != IMG_HEIGHT )
image = scale(image);
return image;
} catch (Exception e) {
e.printStackTrace();
} finally {
return image;
}
}
public static BufferedImage toImage(int[] pixels) {
BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
image.setRGB(0, 0, IMG_WIDTH, IMG_HEIGHT, pixels, 0, IMG_WIDTH);
return image;
}
public static int[] toPixels(BufferedImage image) {
int[] pixels = new int [ image.getWidth() * image.getHeight() ];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
return pixels;
}
public static BufferedImage toImage(byte[] data) {
int[] pixels = new int [ data.length ];
ByteBuffer buffer = ByteBuffer.wrap(data);
int i = 0;
while ( buffer.position() < buffer.capacity() ) {
pixels[i] = buffer.getInt();
i++;
}
return toImage(pixels);
}
public static byte[] toByteArray(BufferedImage image) {
int[] pixels = toPixels(image);
ByteBuffer buffer = ByteBuffer.allocate(pixels.length * 4);
for ( int pixel : pixels ) {
buffer.putInt(pixel);
}
return buffer.array();
}
private static BufferedImage scale(BufferedImage image) {
Image scaled = image.getScaledInstance(IMG_WIDTH, IMG_HEIGHT, Image.SCALE_SMOOTH);
image = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
g2d.drawImage(scaled, 0, 0, null);
g2d.dispose();
return image;
}
}