diff --git a/Comparison/src/main/java/cz/fidentis/analyst/Project.java b/Comparison/src/main/java/cz/fidentis/analyst/Project.java index ffcf7cfa5eb69eb99007f00411e244486bc58b3b..2949bca5bb2c6896ebbc8f333be5a70f463690ac 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 7af2194f284388d483ad7965ea6a3a375fa75e60..68f43d641799751d76bac53620b4b559bc8eaad4 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 1d0eb6d9525c1e22c2fc1767dde128f98b7369b1..62e08e7ac062298f3dc9850e71f6fbd64bb03ef5 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 ae5643e0ab21cfd0f979236c61e793799d0d6fe5..c04fcc01e2301f4d32db8a398a98925f91ce96c0 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 f11e510ff7541445b442531ec4d579346c6b6821..79cc69cdb0bdb10363ffd6ea12b39bd801a498ac 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 abcf91b1fcdb88ea98ea2a0f7fc2c3bcd267c01b..ee05c96cff88e631e8a98fba20ab312e0f2b9b2e 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);