From 4eb345299f047d353c076604e5ce159294750b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Kov=C3=A1r?= <matko@192.168.1.105> Date: Fri, 25 Feb 2022 12:03:41 +0100 Subject: [PATCH] fixed image preview --- .../java/cz/fidentis/analyst/Project.java | 2 +- GUI/pom.xml | 5 ++ .../analyst/project/FaceStatePanel.java | 72 +++++++++++++------ .../analyst/project/ModelsTableModel.java | 9 ++- .../analyst/project/ProjectPanel.form | 2 +- .../analyst/project/ProjectPanel.java | 5 +- 6 files changed, 66 insertions(+), 29 deletions(-) diff --git a/Comparison/src/main/java/cz/fidentis/analyst/Project.java b/Comparison/src/main/java/cz/fidentis/analyst/Project.java index ffcf7cfa..2949bca5 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/Project.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/Project.java @@ -218,7 +218,7 @@ public class Project { Path path = this.getCfg().getPathToFaceByName(name); File file = path.toFile(); face = new HumanFace(file, true); // loads also landmarks, if exist - Path preview = path.resolveSibling(name.concat("_preview.jpg")); + Path preview = path.resolveSibling(name.concat(".jpg")); face.setPreview(preview); this.addFace(face); out.printDuration("Loaded model " + face.getShortName() +" with " + face.getMeshModel().getNumVertices() + " vertices"); diff --git a/GUI/pom.xml b/GUI/pom.xml index 7af2194f..68f43d64 100644 --- a/GUI/pom.xml +++ b/GUI/pom.xml @@ -159,6 +159,11 @@ <artifactId>guava</artifactId> <version>30.1-jre</version> </dependency> + <dependency> + <groupId>org.imgscalr</groupId> + <artifactId>imgscalr-lib</artifactId> + <version>4.2</version> + </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java b/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java index 1d0eb6d9..62e08e7a 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/FaceStatePanel.java @@ -3,16 +3,16 @@ package cz.fidentis.analyst.project; import cz.fidentis.analyst.core.ControlPanel; import cz.fidentis.analyst.face.HumanFace; import java.awt.Dimension; -import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JOptionPane; +import org.imgscalr.Scalr; /** * @@ -22,8 +22,7 @@ public class FaceStatePanel extends ControlPanel { private final ImageIcon notCheck = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "notCheck16x16.png")); private final ImageIcon check = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "check16x16.png")); - //private final ImageIcon warning = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "warning16x16.png")); - private final ImageIcon anonymousFace = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png")); + private final ImageIcon previewBasic = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png")); private ImageIcon previewFace = null; public static final String ICON = "head28x28.png"; @@ -265,38 +264,65 @@ public class FaceStatePanel extends ControlPanel { * @return ImageIcon either loaded face preview or anonymous face when preview is not found */ private ImageIcon getPhoto(HumanFace face, Path path) { - - ImageIcon image; + previewFace = null; - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + BufferedImage image = null; + // If face is loaded to project, preview is loaded from face if (face != null) { if (face.getPreview() != null) { - previewFace = new ImageIcon(face.getPreview().getScaledInstance((int)screenSize.getWidth() - 100, (int)screenSize.getHeight() - 100, Image.SCALE_FAST)); - photo.setToolTipText("Click to enlarge the image"); - return new ImageIcon(face.getPreview().getScaledInstance(240, 160, Image.SCALE_FAST)); + image = face.getPreview(); + + } else { + photo.setToolTipText(""); + return previewBasic; } - photo.setToolTipText(""); - return anonymousFace; - } - - if (path != null && path.toFile().exists()) { + } else if (path != null && path.toFile().exists()) { String pathString = path.toString(); - Path preview = Paths.get(pathString.substring(0, pathString.lastIndexOf(".")).concat("_preview.jpg")); + String name = pathString.substring(0, pathString.lastIndexOf('.')); // remove extention + Path preview = path.resolveSibling(name.concat(".jpg")); try { - - previewFace = new ImageIcon(ImageIO.read(preview.toFile()).getScaledInstance((int)screenSize.getWidth() - 200, (int)screenSize.getHeight() - 200, Image.SCALE_FAST)); - image = new ImageIcon(previewFace.getImage().getScaledInstance(240, 160, Image.SCALE_FAST)); - photo.setToolTipText("Click to enlarge the image"); - return image; + image = ImageIO.read(preview.toFile()); } catch (IOException ex) { //Exceptions.printStackTrace(ex);) } + + } + + if (image == null) { + + // Basic black siluete + photo.setToolTipText(""); + return previewBasic; } - photo.setToolTipText(""); - return anonymousFace; + + image = scaleAndRotateIfNeeded(image); + + previewFace = new ImageIcon(image); + photo.setToolTipText("Click to enlarge the image"); + + return new ImageIcon(Scalr.resize(image, 240, 160)); + + } + + /** + * Scales photo and rotates if width is bigger than height + * @param image BufferedImage to be scaled or rotated + * @return scaled and rotated image + */ + private BufferedImage scaleAndRotateIfNeeded(BufferedImage image) { + + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + + if (image.getWidth() > image.getHeight()) { + image = Scalr.rotate(image, Scalr.Rotation.CW_270, Scalr.OP_ANTIALIAS); + } + + image = Scalr.resize(image, (int)screenSize.getHeight() - 200); + + return image; } /** diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java b/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java index ae5643e0..c04fcc01 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ModelsTableModel.java @@ -1,6 +1,5 @@ package cz.fidentis.analyst.project; -import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Path; @@ -8,6 +7,7 @@ import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.table.DefaultTableModel; import org.openide.util.Exceptions; +import org.imgscalr.Scalr; /** * List of faces TableModel @@ -69,7 +69,12 @@ public class ModelsTableModel extends DefaultTableModel { } else { try { BufferedImage image = ImageIO.read(path.toFile()); - addRow(new Object[]{false, name, new ImageIcon(image.getScaledInstance(75, 50, Image.SCALE_FAST))}); + if (image.getWidth() > image.getHeight()) { + image = Scalr.rotate(image, Scalr.Rotation.CW_270, Scalr.OP_ANTIALIAS); + } + //BufferedImage rotatedImage = Scalr.rotate(image, Scalr.Rotation.CW_90, Scalr.OP_ANTIALIAS); + BufferedImage scaledImage = Scalr.resize(image, 70, 55); + addRow(new Object[]{false, name, new ImageIcon(scaledImage)}); } catch (IOException ex) { Exceptions.printStackTrace(ex); } diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form index f11e510f..79cc69cd 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.form @@ -211,7 +211,7 @@ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor" postCode="table.getTableHeader().setOpaque(false);
table.getTableHeader().setBackground(new java.awt.Color(204,204,204));
table.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 18));
model.addTableModelListener(new TableModelListener() {
 public void tableChanged(TableModelEvent e) {
 jTable1TableChanged(e);
 }
});"> <Font name="Tahoma" size="18" style="0"/> </Property> - <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor" postCode="table.getColumnModel().getColumn(0).setMaxWidth(50);
table.getColumnModel().getColumn(2).setMaxWidth(75);
table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);
table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75);"> + <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor" postCode="table.getColumnModel().getColumn(0).setMaxWidth(50);
table.getColumnModel().getColumn(2).setMaxWidth(85);
table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);
table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75);"> <Connection code="model" type="code"/> </Property> <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> diff --git a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java index abcf91b1..ee05c96c 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java +++ b/GUI/src/main/java/cz/fidentis/analyst/project/ProjectPanel.java @@ -186,7 +186,7 @@ public class ProjectPanel extends JPanel { }); table.setModel(model); table.getColumnModel().getColumn(0).setMaxWidth(50); - table.getColumnModel().getColumn(2).setMaxWidth(75); + table.getColumnModel().getColumn(2).setMaxWidth(85); table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50); table.getTableHeader().getColumnModel().getColumn(2).setMaxWidth(75); table.setDragEnabled(true); @@ -520,7 +520,8 @@ public class ProjectPanel extends JPanel { if (project.addNewPath(path)) { - Path preview = path.resolveSibling(name.concat("_preview_small.jpg")); + //Path preview = path.resolveSibling(name.concat("_preview_small.jpg")); + Path preview = path.resolveSibling(name.concat(".jpg")); model.addRowWithName(name, preview); filterPanel.checkAllFacesLoaded(false); -- GitLab