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
}
}
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
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
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