Redimensionamentode imagens (altura e tamanho) c/ Java IO e salvando no diretório C: do Windows

[code] 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?
 }[/code]

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

[code]// 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();
}[/code]

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:

[code]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
 }[/code]

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á:

[code]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();
	 }	 
 }[/code]
  • Estamos utilizando Struts2, pensei em algo como if (session == nulll) {deletaImagensTemporarias()};
  • Estou pesquisando como diminuir a perca de qualidade da imagem gerada pois a imagem redimensionada fica muito estressada mal dá pra reconhecer o conteúdo dela;
  • System.out.println(System.getProperty(“tmpdir”)); ou “temp” imprimi null, fiz algo errado? Pesquisei ví q qdo. dou System.getProperties() ele imprimi um montam de propriedades, puxa, isso é novidade pra mim…

abraços,
AS

Descubrí o porquê q não estava acessando o diretório temp, é porque precisa passar a chave, veja:

[code]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();
	 }	 
 }[/code]

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

[code]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();

}[/code]

[code]public static String getFileExtension(File file){

	String nomeArquivo = file.getName();
	String extensao = nomeArquivo.substring(nomeArquivo.lastIndexOf('.') + 1);  
	return extensao;
}[/code]

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 :smiley: :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á?