Autopsy  3.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
MediaViewImagePanel.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2013 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.corecomponents;
20 
21 import java.awt.Dimension;
22 import java.awt.EventQueue;
23 import java.awt.image.BufferedImage;
24 import java.io.IOException;
25 import java.io.InputStream;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.List;
29 import java.util.logging.Level;
30 import javafx.application.Platform;
31 import javafx.embed.swing.JFXPanel;
32 import javafx.embed.swing.SwingFXUtils;
33 import javafx.scene.Scene;
34 import javafx.scene.image.Image;
35 import javafx.scene.image.ImageView;
36 import javafx.scene.layout.BorderPane;
37 import javax.imageio.ImageIO;
38 import javax.swing.SwingUtilities;
39 import org.openide.util.NbBundle;
46 
51  public class MediaViewImagePanel extends javax.swing.JPanel {
52  private JFXPanel fxPanel;
53  private ImageView fxImageView;
54  private static final Logger logger = Logger.getLogger(MediaViewImagePanel.class.getName());
55  private boolean fxInited = false;
56 
57  private final List<String> supportedExtensions;
58  static private final List<String> supportedMimes = Arrays.asList("image/jpeg", "image/png", "image/gif", "image/bmp", "image/x-ms-bmp"); //NON-NLS
59 
66  if (fxInited) {
67  setupFx();
68  }
69 
70  supportedExtensions = new ArrayList<>();
71  //logger.log(Level.INFO, "Supported image formats by javafx image viewer: ");
72  for (String suffix : ImageIO.getReaderFileSuffixes()) {
73  //logger.log(Level.INFO, "suffix: " + suffix);
74  supportedExtensions.add("." + suffix);
75  }
76  }
77 
78  public boolean isInited() {
79  return fxInited;
80  }
81 
85  private void setupFx() {
86  // load the image
87  Platform.runLater(new Runnable() {
88  @Override
89  public void run() {
90  fxPanel = new JFXPanel();
91  fxImageView = new ImageView();
92  // resizes the image to have width of 100 while preserving the ratio and using
93  // higher quality filtering method; this ImageView is also cached to
94  // improve performance
95  fxImageView.setPreserveRatio(true);
96  fxImageView.setSmooth(true);
97  fxImageView.setCache(true);
98 
99  EventQueue.invokeLater(new Runnable() {
100  @Override
101  public void run() {
102  add(fxPanel);
103 
104  //TODO
105  // setVisible(true);
106  }
107  });
108  }
109  });
110  }
111 
112  public void reset() {
113  Platform.runLater(new Runnable() {
114  @Override
115  public void run() {
116  fxImageView.setImage(null);
117  }
118  });
119  }
120 
127  void showImageFx(final AbstractFile file, final Dimension dims) {
128  if (!fxInited) {
129  return;
130  }
131 
132  final String fileName = file.getName();
133 
134  //hide the panel during loading/transformations
135  fxPanel.setVisible(false);
136 
137  // load the image
138  Platform.runLater(new Runnable() {
139  @Override
140  public void run() {
141  if (!Case.isCaseOpen()) {
142  //handle in-between condition when case is being closed
143  //and an image was previously selected
144  return;
145  }
146 
147  final InputStream inputStream = new ReadContentInputStream(file);
148 
149  final Image fxImage;
150  try {
151  //original input stream
152  BufferedImage bi = ImageIO.read(inputStream);
153  if (bi == null) {
154  logger.log(Level.WARNING, "Could image reader not found for file: " + fileName); //NON-NLS
155  return;
156  }
157  //scale image using Scalr
158  BufferedImage biScaled = ScalrWrapper.resizeHighQuality(bi, (int) dims.getWidth(), (int) dims.getHeight());
159  //convert from awt imageto fx image
160  fxImage = SwingFXUtils.toFXImage(biScaled, null);
161  } catch (IOException ex) {
162  logger.log(Level.WARNING, "Could not load image file into media view: " + fileName, ex); //NON-NLS
163  return;
164  } catch (OutOfMemoryError ex) {
165  logger.log(Level.WARNING, "Could not load image file into media view (too large): " + fileName, ex); //NON-NLS
166  MessageNotifyUtil.Notify.warn(
167  NbBundle.getMessage(this.getClass(), "MediaViewImagePanel.imgFileTooLarge.msg", file.getName()),
168  ex.getMessage());
169  return;
170  } finally {
171  try {
172  inputStream.close();
173  } catch (IOException ex) {
174  logger.log(Level.WARNING, "Could not close input stream after loading image in media view: " + fileName, ex); //NON-NLS
175  }
176  }
177 
178  if (fxImage == null || fxImage.isError()) {
179  logger.log(Level.WARNING, "Could not load image file into media view: " + fileName); //NON-NLS
180  return;
181  }
182 
183  //use border pane to center the image in the scene
184  BorderPane borderpane = new BorderPane();
185  borderpane.setCenter(fxImageView);
186 
187  fxImageView.setImage(fxImage);
188  fxImageView.setFitWidth(dims.getWidth());
189  fxImageView.setFitHeight(dims.getHeight());
190 
191  //Group fxRoot = new Group();
192 
193  //Scene fxScene = new Scene(fxRoot, dims.getWidth(), dims.getHeight(), javafx.scene.paint.Color.BLACK);
194  Scene fxScene = new Scene(borderpane, javafx.scene.paint.Color.BLACK);
195  // borderpane.getChildren().add(fxImageView);
196 
197  fxPanel.setScene(fxScene);
198 
199  SwingUtilities.invokeLater(new Runnable() {
200  @Override
201  public void run() {
202  //show the panel after fully loaded
203  fxPanel.setVisible(true);
204  }
205  });
206 
207  }
208  });
209 
210  }
211 
216  public List<String> getMimeTypes() {
217  return supportedMimes;
218  }
219 
224  public List<String> getExtensions() {
225  return supportedExtensions;
226  }
227 
233  @SuppressWarnings("unchecked")
234  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
235  private void initComponents() {
236 
237  setBackground(new java.awt.Color(0, 0, 0));
238  setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
239  }// </editor-fold>//GEN-END:initComponents
240  // Variables declaration - do not modify//GEN-BEGIN:variables
241  // End of variables declaration//GEN-END:variables
242 }
static Logger getLogger(String name)
Definition: Logger.java:131

Copyright © 2012-2015 Basis Technology. Generated on: Mon Oct 19 2015
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.