2015-03-26 5 views
1

Je fais une application javafx (javafx 2, jdk 7u72) dans laquelle l'utilisateur peut importer (avec un sélecteur de fichier) une image et celle-ci est stockée dans un dossier externe. Je souhaite que l'image soit automatiquement réduite à 25 ou 30 ko ou 250 x 250 puis stockée dans le dossier.Java fx2 Je veux redimensionner l'image avant d'enregistrer cette

+0

Ce code est un morceau de mon application JavaFX. Chaque fichier d'image où l'utilisateur choisit (et qui peut être 2 Mo ou 10 Mo) chargé sur l'application pour l'affichage. Cela dépense trop de mémoire de ram. Pour cette raison, chaque image doit être réduite à 25 ou 30 Ko avant d'exécuter le code de ligne: Files.copy (sourceFile, destinationFile); – Farmer

+0

Je comprends. Mais qu'avez-vous essayé, pour réduire réellement la taille de l'image/fichier, jusqu'ici? Aussi, gardez à l'esprit que stackoverflow n'est pas une usine de code. :-) – haraldK

+0

Ok, je vais essayer de résoudre ce problème, mais je n'ai pas d'expérience avec javafx 2. Ensuite, je poste toute solution que je trouve pour la correction par les utilisateurs de stackoverflow. – Farmer

Répondre

0

Je trouve une très bonne solution de ce site http://blog.codejava.net/nam/reduce-image-quality-without-resizing/

package bilpir; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.Iterator; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Label; 
import javafx.stage.FileChooser; 
import javax.imageio.IIOImage; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageWriteParam; 
import javax.imageio.ImageWriter; 
import javax.imageio.stream.FileImageOutputStream; 


public class FXMLDocumentbilController implements Initializable { 

    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 

     try {   
      //Files.copy(sourceFile, destinationFile); 

    float quality = 0.2f; 

     Iterator iter = ImageIO.getImageWritersByFormatName("jpeg"); 

     ImageWriter writer = (ImageWriter)iter.next(); 

     ImageWriteParam iwp = writer.getDefaultWriteParam(); 

     iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

     iwp.setCompressionQuality(quality); 

     FileChooser fileChooser = new FileChooser();   
     fileChooser.setInitialDirectory(
     new File(System.getProperty("user.home"))); 

     fileChooser.getExtensionFilters().addAll(
     new FileChooser.ExtensionFilter("Icons JPG, PNG, GIF", "*.jpg", "*.gif", "*.png")); 
     File file = fileChooser.showOpenDialog(null);  


     Path sourceFile = Paths.get(file.toString()); 
     Path destinationFile = Paths.get("c:\\bilpir", file.getName()); 

     FileInputStream inputStream = new FileInputStream(sourceFile.toString()); 
     BufferedImage originalImage = ImageIO.read(inputStream); 

     File file2 = new File(destinationFile.toString()); 
     FileImageOutputStream output = new FileImageOutputStream(file2); 
     writer.setOutput(output); 

     IIOImage image = new IIOImage(originalImage, null, null); 
     writer.write(null, image, iwp); 
     writer.dispose(); 


     } catch (IOException ex) { 
      Logger.getLogger(FXMLDocumentbilController.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

}