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

19 respostas
A
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?
	 }

19 Respostas

Paulo_Silveira

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.

E

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.

A

Legal Paulo, vou testar já…

rezende.martins

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.

A

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

Paulo_Silveira

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.

rezende.martins

Verdade. Ele troca. O mkdirs() vai criar a estrutura de diretórios pra vc. Depois você dá New File no arquivo.

rezende.martins
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.

E

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();
  }
rezende.martins

O “New File” criaria um objeto em memória, não o arquivo. Ele poderia mesclar o meu código com o dele.

A

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

E

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

A

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();
		 }	 
	 }
- 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

A

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();
		 }	 
	 }
A

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

viniciusalvess
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;
	}
A

perfectly!

valeu a atenção de todos

AS

A

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

A

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

Criado 10 de novembro de 2010
Ultima resposta 16 de nov. de 2010
Respostas 19
Participantes 5