public static void main(String[] args) throws IOException {
BufferedImage imagem = ImageIO.read(new GaleriaImagemAction().pegaImagem()); // Recebe uma imagem no formato InputStream, vindo de um Blob
int new_w = 512, new_h = 384; // Definição de altura e largura
BufferedImage new_img = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); // Passando no construtor de BufferedImage
//largura; altura; tipo da imagem
Graphics2D graphics2d = new_img.createGraphics();// Uso da classe abstrata Graphics2D para manipulação da imagem (layout, cor etc)
graphics2d.drawImage(imagem, new_w, new_h, null); //? null no lugar de uma interface BufferedImageOp
ImageIO.write(new_img, "JPG", new File("C:/imagens/redimensionadas/" + imagem)); //Ele não deveria criar este diretório
//e nele jogar a imagem que está no objeto
//BufferedImagem no estado de InputStream
//convertendo para um .jpg?
}
Redimensionamentode imagens (altura e tamanho) c/ Java IO e salvando no diretório C: do Windows
19 Respostas
acho que vc precisa chamar o mkdirs antes:
File f = new File(“C:/imagens/redimensionadas/” + imagem);
f.mkdirs();
ai passe o F como argumento. Nao sei se é apenas esse o problema, ha muito tempo não trabalho com imagens no java.
qual a dúvida que eu não entendi?
Se for criar a pasta, que eu saiba, ele não criaria automaticamente, você teria que dar um file.mkdirs(); para isso.
Legal Paulo, vou testar já…
Olá André,
Você precisa criar o diretório antes. Verifica se o diretório existe, cria com a função que o Paulo comentou. E depois cria o arquivo com New File na pasta que você criou.
Oi gente,
resultado:
Marcelo:
1 - se eu usar a barra “” ele dá erro de compilação, ele não entende como String… Fiz um teste ele entende usando este “/”;
Paulo / evefuji:
2 - dei o mkdirs() só ainda não está pegando a imagem e a colocando na pastinha especificada
oi andre
por isso o marcelo disse para usar duas barras invertidas, pois ai da escape na barra. mas hoje em dia o construtor do File troca as barras normais por invertidas no caso windows.
Verdade. Ele troca. O mkdirs() vai criar a estrutura de diretórios pra vc. Depois você dá New File no arquivo.
File diretorioImagens = new File("C:/testes/imagens");
if(!diretorioImagens.exists()){
diretorioImagens.mkdirs();
}
File imagem1 = new File("C:/testes/imagens/imagem1.png");
Segue o código. A primeira parte cria o diretório e depois vc joga a imagem na pasta que você criou.
rezende, acho que esse seu "new File" não vai criar o arquivo, apenas vai criar um ponteiro para o arquivo no disco.
Andre, aqui o meu código para redimensionar imagem// como "aspect ratio"
File image = new File (nomeImagem);
BufferedImage bi;
try {
bi = ImageIO.read(image);
double thumbRatio = (double) width / (double) height;
int imageWidth = bi.getWidth(null);
int imageHeight = bi.getHeight(null);
double imageRatio = (double) imageWidth / (double) imageHeight;
if (thumbRatio < imageRatio) {
height = (int) (width / imageRatio);
} else {
width = (int) (height * imageRatio);
}
// Fim do cálculo
BufferedImage thumbImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(bi, 0, 0, width, height, null);
ImageIO.write(thumbImage, "jpg", new File(nomeThumb));
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException " + e.getMessage());
} catch (IOException e) {
System.out.println("IOException " + e.getMessage());
e.printStackTrace();
}
O “New File” criaria um objeto em memória, não o arquivo. Ele poderia mesclar o meu código com o dele.
Puxa, gente, me ajudaram de +... Adorei todos os exemplos...
Vejam o código:
static String nomeDoImagem;
public static void main(String[] args) throws IOException {
BufferedImage imagem = ImageIO.read(new GaleriaImagemAction().pegaImagem()); // Recebe uma imagem no formato InputStream, vindo de um Blob
int new_w = 200, new_h = 200; // Definição de altura e largura
BufferedImage new_img = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); // Passando no construtor de BufferedImage
//largura; altura; tipo da imagem
Graphics2D graphics2d = new_img.createGraphics();// Uso da classe abstrata Graphics2D para manipulação da imagem (layout, cor etc)
boolean wasRendered = graphics2d.drawImage(imagem,0,0,new_w, new_h, null); //? null no lugar de uma interface BufferedImageOp
System.out.println("wasRendered: " + wasRendered);
File diretorio = new File("C:/imagem3/redimensionada");
if (!diretorio.exists())
diretorio.mkdirs();
nomeDoImagem = "teste1";
ImageIO.write(new_img, "GIF", new File("C:\imagem3/redimensionada/" + nomeDoImagem + ".png" )); //Ele pega o diretório criado pelo mkdirs()
//e nele coloca a imagem que está no objeto
//BufferedImagem no estado de InputStream
//convertendo para um .jpg
}
Me deparo agora com as seguintes situações:
- Como salvar este arquivo na pasta temporária do computador (deixando portável Linux, Windows etc),
- Depois q o usuário sair do sistema, deslogar, limpar do temp
já pensou em criar uma pasta diretamente na pasta do projeto para arquivos temporários?
Caso queira usar a pasta do SO mesmo, acho que isso resolve:
System.getProperty("temp");
E no evento de deslogar ou de sair (depende do framework que você está utilizando e da sua implementação de login), você pode pegar todos os arquivos da pasta (com o metodo listFiles() ) e dar um delete nele
Oi evefuji, bom dia,
puxa, legal hem! Com a dica q vc deu no último post veja como já está:
static String nomeDoImagem;
static File diretorio = new File("C:/andreas/redimensionada");
public static void main(String[] args) throws IOException {
BufferedImage imagem = ImageIO.read(new GaleriaImagemAction().pegaImagem()); // Recebe uma imagem no formato InputStream, vindo de um Blob
int new_w = 200, new_h = 200; // Definição de altura e largura
BufferedImage new_img = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); // Passando no construtor de BufferedImage
//largura; altura; tipo da imagem
Graphics2D graphics2d = new_img.createGraphics();// Uso da classe abstrata Graphics2D para manipulação da imagem (layout, cor etc)
boolean wasRendered = graphics2d.drawImage(imagem,0,0,new_w, new_h, null); //? null no lugar de uma interface BufferedImageOp
System.out.println("wasRendered: " + wasRendered);
if (!diretorio.exists())
diretorio.mkdirs();
nomeDoImagem = "dfs";
ImageIO.write(new_img, "jpg", new File("C:\andreas/redimensionada/" + nomeDoImagem + ".jpg" )); //Ele pega o diretório criado pelo mkdirs()
//e nele coloca a imagem que está no objeto
//BufferedImagem no estado de InputStream
//convertendo para um .jpg
deletaImagensTemporarias();
}
private static void deletaImagensTemporarias(){
File[] todasImagens = diretorio.listFiles();
for (int i = 0; i < todasImagens.length; i++) {
todasImagens[i].delete();
}
}
if (session == nulll) {deletaImagensTemporarias()}
abraços,
AS
Descubrí o porquê q não estava acessando o diretório temp, é porque precisa passar a chave, veja:
static String nomeDoImagem;
static File diretorio = new File(System.getProperty("java.io.tmpdir"));
public static void main(String[] args) throws IOException {
BufferedImage imagem = ImageIO.read(new GaleriaImagemAction().pegaImagem()); // Recebe uma imagem no formato InputStream, vindo de um Blob
int new_w = 200, new_h = 200; // Definição de altura e largura
BufferedImage new_img = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); // Passando no construtor de BufferedImage
//largura; altura; tipo da imagem
Graphics2D graphics2d = new_img.createGraphics();// Uso da classe abstrata Graphics2D para manipulação da imagem (layout, cor etc)
boolean wasRendered = graphics2d.drawImage(imagem,0,0,new_w, new_h, null); //? null no lugar de uma interface BufferedImageOp
System.out.println("wasRendered: " + wasRendered);
if (!diretorio.exists())
diretorio.mkdirs();
nomeDoImagem = "dfs";
ImageIO.write(new_img, "jpg", new File(System.getProperty("java.io.tmpdir") + nomeDoImagem + ".jpg" )); //Ele pega o diretório criado pelo mkdirs()
//e nele coloca a imagem que está no objeto
//BufferedImagem no estado de InputStream
//convertendo para um .jpg
//deletaImagensTemporarias();
}
private static void deletaImagensTemporarias(){
File[] todasImagens = diretorio.listFiles();
for (int i = 0; i < todasImagens.length; i++) {
todasImagens[i].delete();
}
}
Gente, alguém conseguiria me explicar o porquê não consigo criar uma subpasta dentro do diretório temp?
saveImage(img, .9f, System.getProperty("java.io.tmpdir")+ "\nomeDaSubpasta\" + "Ninféiass_new2d.jpg"); // Estam sendo passados de argumento: InputStream (foto), qualidade da imagem e o diretório temp do SO
public static void resizeAndSave(File in, File out,String nome,int width,int height) throws IOException{
if(! out.isDirectory()){
out.mkdirs();
out = new File(out, nome);
}else{
out = new File(out, nome);
}
BufferedImage imageInput = ImageIO.read(in);
BufferedImage neBf = new BufferedImage(width, height, Image.SCALE_SMOOTH);
Graphics2D dd = neBf.createGraphics();
dd.drawImage(imageInput,0,0,width,height,null);
FileOutputStream fos = new FileOutputStream(out,true);
ImageIO.write(neBf, FileUtils.getFileExtension(in), fos);
fos.flush();
fos.close();
}
public static String getFileExtension(File file){
String nomeArquivo = file.getName();
String extensao = nomeArquivo.substring(nomeArquivo.lastIndexOf('.') + 1);
return extensao;
}
perfectly!
valeu a atenção de todos
AS
Gente, como vai?
Me deparo com uma nova situação:
1-Os arquivos não estão sendo gerados no temp (client) e sim estão sendo gerados no temp do servidor. Por que será? Imaginei que o
System.getProperty("java.io.tmpdir"); fizesse toda a mágina do trabalho mas na prática não está sendo feito assim…
abraço,
André AS
:shock: :?:
Realmente muito estranho, não? Estive pesquisando e conversando com algumas pessoas, percebí que de fato não há um link estabelecido com a máquina cliente, ou há?