Captura de Fotos

Bom, precisa capturar todas as fotos .jpg dentro de uma pasta que o usuário passar, reduzir o tamanho das fotos e enviar todas para uma outra pasta.

Alguem pode ajudar ?

Bom, uma das libs que podem ajudar é a iText para ajustar o tamanho das imagens:

      RandomAccessFileOrArray myTiffFile = new RandomAccessFileOrArray("C:/temp/picture.tif");
      int numberOfPages = TiffImage.getNumberOfPages(myTiffFile);
      // Run a for loop to extract images from Tiff file into a Image object and add to PDF recursively
      for(int i=1; i<=numberOfPages; i++) {
        Image tempImage = TiffImage.getTiffImage(myTiffFile, i);
        tempImage.scalePercent(25); // 25%
      }

Para verificar se é pasta ou arquivo use a classe File, e para copiar:

  public void copyFile(String origem, String destino) {	
    InputStream inStream = null;
    OutputStream outStream = null;
    try {
      File afile = new File(origem);
      File bfile = new File(destino);
      inStream = new FileInputStream(afile);
      outStream = new FileOutputStream(bfile);
      byte[] buffer = new byte[1024];
      int length;
      while ((length = inStream.read(buffer)) > 0) { outStream.write(buffer, 0, length); }
      inStream.close();
      outStream.flush(); 
      outStream.close();
    } catch(IOException e){ ... }
  } 

Flw!

Bom, lendo um pouco achei um tal de JFileChooser mas não encontrei ele no WIndowBuilder.

O que fazer?

A classe é ‘File’ mesmo, por exemplo:

File f = new File("C:/temp");
if (f.isDirectory()) { ... }

Salvo engano, ‘JFileChooser’ é indicada para aplicações GUI. Não é o caso, pelo menos você não citou.

Desculpe não citar, mas estou utilizando GUI (com WindowBuilder).

Nunca trabalhei com esta classe, mas ainda acho que File será mais útil para você.

  1. Para o usuário escolher a pasta, use um JFileChooser;
  2. Para carregar a imagem do disco, use o comando ImageIO.read:
BufferedImage img = ImageIO.read(arquivo);
  1. Para reduzir o tamanho da imagem, você pode usar o método getResizedImage ou o Graphics;
  2. Para gravar novamente a imagem, use o ImageIO.write.

O WindowBuilder é só um editor de janelas (assim como o Word é um editor de texto). Precisamos saber é se você usa com Swing, AWT ou SWT (se suas classes de janela começam com J, é Swing).

Pois então ViniGodoy, não encontro o JFileChooser no WindowBuilder.

O JFileChooser você usa no evento de botão:
http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html

Bom já entendi o funcionamento do JFileChooser, porém não achei como selecionar todos os arquivos dentro de uma pasta (já sei que devo usa o DIRECTORY_ONLY).

Consegui. Tópico Resolvido !! :smiley:

E cadê a solução?

Bom, então vamos a solução.

1- configuro o JFileChooser:

//Configuramos o JFileChooser fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

2- Seleciono o destino das fotos:

//Selecionamos o destino das fotos
		btnDestino = new JButton("Sel. Destino");
		btnDestino.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				selectDestinyOfImages();
			}
		});

private void selectDestinyOfImages(){
int returnVal = fc.showOpenDialog(contentPane);
		
		if (returnVal == fc.APPROVE_OPTION){
			File dir = fc.getSelectedFile();
			destiny_directory = dir.getAbsolutePath();
			lblDestino.setText(destiny_directory);
		}
	}

3 - Seleciono a origem das imagens


			//Selecionamos a origem das fotos
			JButton btnOrigem = new JButton("Sel. Origem");		
			btnOrigem.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					takeImagesFromSource();
				}
			});

private void takeImagesFromSource(){
		int returnVal = fc.showOpenDialog(contentPane);
		
		if (returnVal == fc.APPROVE_OPTION){
			File dir = fc.getSelectedFile();		
			source_directory = dir.getAbsolutePath();
			lblOrigem.setText(source_directory);
	
			
		
			//Captura todas as imagens em JPG dentro da pasta srcdir
			lista_de_fotos = dir.listFiles(new java.io.FileFilter() {
				
				@Override
				public boolean accept(File f) {
					String nome = f.getName().toLowerCase();
					 return nome.endsWith("jpg") || nome.endsWith("bmp");
				}
			});		  
			
			
		}else
			System.out.println("Ação Cancelada pelo Usuário");
	}	

4 - Redimensiono as imagens

btnRedimensionar = new JButton("Redimensionar");
		btnRedimensionar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					ResizeImageAndSave();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});


private void ResizeImageAndSave() throws IOException{
			
			
			int qtd_fotos = lista_de_fotos.length;			
			
		
		for (int i=0;i<qtd_fotos;i++){
			
			
			//Caminho absoluto da imagem origem e imagem destino
			String full_source_image = source_directory+"\\"+lista_de_fotos[i].getName();
			String full_destiny_image = destiny_directory+"\\"+lista_de_fotos[i].getName();
			
						
			//Se o diretorio destino nao existe criaremos ele
			File check_dir = new File(destiny_directory);
			if (!check_dir.exists())
				  check_dir.mkdir();
			
			int new_w = 800, new_h = 600;
			BufferedImage old_image = ImageIO.read(new File(full_source_image));
			BufferedImage new_image = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = new_image.createGraphics();
			g.drawImage(old_image, 0, 0, new_w, new_h, null);	
			
			//Grava imagem no novo caminho
			ImageIO.write(new_image, "JPG", new File(full_destiny_image));
		}
			
	}