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);&#xa;table.getTableHeader().setBackground(new java.awt.Color(204,204,204));&#xa;table.getTableHeader().setFont(new java.awt.Font(&quot;Tahoma&quot;, 0, 18));&#xa;model.addTableModelListener(new TableModelListener() {&#xa;    public void tableChanged(TableModelEvent e) {&#xa;        jTable1TableChanged(e);&#xa;    }&#xa;});">
               <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);&#xa;table.getColumnModel().getColumn(2).setMaxWidth(75);&#xa;table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);&#xa;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);&#xa;table.getColumnModel().getColumn(2).setMaxWidth(85);&#xa;table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(50);&#xa;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