Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package digital.test; import com.digitalpersona.onetouch.DPFPCaptureFeedback; import com.digitalpersona.onetouch.DPFPDataPurpose; import com.digitalpersona.onetouch.DPFPFeatureSet; import com.digitalpersona.onetouch.DPFPGlobal; import com.digitalpersona.onetouch.DPFPSample; import com.digitalpersona.onetouch.DPFPTemplate; import com.digitalpersona.onetouch.capture.DPFPCapture; import com.digitalpersona.onetouch.capture.event.DPFPDataAdapter; import com.digitalpersona.onetouch.capture.event.DPFPDataEvent; import com.digitalpersona.onetouch.capture.event.DPFPImageQualityAdapter; import com.digitalpersona.onetouch.capture.event.DPFPImageQualityEvent; import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusAdapter; import com.digitalpersona.onetouch.capture.event.DPFPReaderStatusEvent; import com.digitalpersona.onetouch.capture.event.DPFPSensorAdapter; import com.digitalpersona.onetouch.capture.event.DPFPSensorEvent; import com.digitalpersona.onetouch.processing.DPFPFeatureExtraction; import com.digitalpersona.onetouch.processing.DPFPImageQualityException; import com.digitalpersona.onetouch.verification.DPFPVerification; import com.digitalpersona.onetouch.verification.DPFPVerificationResult; import digital.digital.S1_test; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.SwingUtilities; import mijzcx.synapse.desk.utils.CloseDialog; import mijzcx.synapse.desk.utils.KeyMapping; import mijzcx.synapse.desk.utils.KeyMapping.KeyAction; import org.apache.commons.io.IOUtils; import synsoftech.fields.Button; /** * * @author Guinness */ public class Dlg_test extends javax.swing.JDialog { /** * Creates new form Dlg_test */ //<editor-fold defaultstate="collapsed" desc=" callback "> private Callback callback; public void setCallback(Callback callback) { this.callback = callback; } public static interface Callback { void ok(CloseDialog closeDialog, OutputData data); } public static class InputData { } public static class OutputData { } //</editor-fold> //<editor-fold defaultstate="collapsed" desc=" Constructors "> private Dlg_test(java.awt.Frame parent, boolean modal) { super(parent, modal); setUndecorated(true); initComponents(); myInit(); } private Dlg_test(java.awt.Dialog parent, boolean modal) { super(parent, modal); setUndecorated(true); initComponents(); myInit(); } public Dlg_test() { super(); setUndecorated(true); initComponents(); myInit(); } private Dlg_test myRef; private void setThisRef(Dlg_test myRef) { this.myRef = myRef; } private static java.util.Map<Object, Dlg_test> dialogContainer = new java.util.HashMap(); public static void clearUpFirst(java.awt.Window parent) { if (dialogContainer.containsKey(parent)) { dialogContainer.remove(parent); } } public static Dlg_test create(java.awt.Window parent, boolean modal) { if (modal) { return create(parent, ModalityType.APPLICATION_MODAL); } return create(parent, ModalityType.MODELESS); } public static Dlg_test create(java.awt.Window parent, java.awt.Dialog.ModalityType modalType) { if (parent instanceof java.awt.Frame) { Dlg_test dialog = dialogContainer.get(parent); if (dialog == null) { dialog = new Dlg_test((java.awt.Frame) parent, false); dialog.setModalityType(modalType); dialogContainer.put(parent, dialog); java.util.logging.Logger.getAnonymousLogger().log(Level.INFO, "instances: {0}", dialogContainer.size()); dialog.setThisRef(dialog); return dialog; } else { dialog.setModalityType(modalType); return dialog; } } if (parent instanceof java.awt.Dialog) { Dlg_test dialog = dialogContainer.get(parent); if (dialog == null) { dialog = new Dlg_test((java.awt.Dialog) parent, false); dialog.setModalityType(modalType); dialogContainer.put(parent, dialog); java.util.logging.Logger.getAnonymousLogger().log(Level.INFO, "instances: {0}", dialogContainer.size()); dialog.setThisRef(dialog); return dialog; } else { dialog.setModalityType(modalType); return dialog; } } return null; } //</editor-fold> //<editor-fold defaultstate="collapsed" desc=" main "> public static void main(String args[]) { try { javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { throw new RuntimeException(e); } Dlg_test dialog = Dlg_test.create(new javax.swing.JFrame(), true); dialog.setVisible(true); } //</editor-fold> //<editor-fold defaultstate="collapsed" desc=" added "> @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible == true) { getContentPane().removeAll(); initComponents(); myInit(); repaint(); } } public javax.swing.JPanel getSurface() { return (javax.swing.JPanel) getContentPane(); } public void nullify() { myRef.setVisible(false); myRef = null; } //</editor-fold> /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jButton1 = new Button.Default(); jCheckBox1 = new javax.swing.JCheckBox(); jCheckBox2 = new javax.swing.JCheckBox(); jButton2 = new Button.Default(); jCheckBox3 = new javax.swing.JCheckBox(); jButton3 = new Button.Default(); jCheckBox4 = new javax.swing.JCheckBox(); jButton4 = new Button.Default(); jButton5 = new Button.Success(); jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jTextField1 = new javax.swing.JTextField(); jButton6 = new Button.Success(); jLabel2 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); jPanel1.setBackground(new java.awt.Color(255, 255, 255)); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204))); jButton1.setText("1"); jCheckBox1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jCheckBox2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jButton2.setText("2"); jCheckBox3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jButton3.setText("3"); jCheckBox4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jButton4.setText("4"); jButton5.setText("Save"); jButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton5ActionPerformed(evt); } }); jTextArea1.setColumns(20); jTextArea1.setFont(new java.awt.Font("Tahoma", 0, 13)); // NOI18N jTextArea1.setLineWrap(true); jTextArea1.setRows(5); jTextArea1.setFocusable(false); jScrollPane1.setViewportView(jTextArea1); jButton6.setText("Retrive Prints"); jButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton6ActionPerformed(evt); } }); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204))); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup().addGap(19, 19, 19).addGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 390, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 388, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout .createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jCheckBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout .createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jCheckBox2, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout .createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jCheckBox3, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap( javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout .createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jButton4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jCheckBox4, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE))) .addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addComponent(jButton6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(351, Short.MAX_VALUE))); jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup().addGap(19, 19, 19) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jCheckBox4, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1).addComponent(jButton4, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jCheckBox3, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1).addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(jPanel1Layout .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jCheckBox2, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1).addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jCheckBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1).addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addGap(26, 26, 26).addComponent(jButton5, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(40, 40, 40) .addComponent(jButton6, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE) .addContainerGap())); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent( jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); pack(); }// </editor-fold>//GEN-END:initComponents private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed save_list(); }//GEN-LAST:event_jButton5ActionPerformed private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed list2(); }//GEN-LAST:event_jButton6ActionPerformed /** * @param args the command line arguments */ // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JButton jButton5; private javax.swing.JButton jButton6; private javax.swing.JCheckBox jCheckBox1; private javax.swing.JCheckBox jCheckBox2; private javax.swing.JCheckBox jCheckBox3; private javax.swing.JCheckBox jCheckBox4; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextField jTextField1; // End of variables declaration//GEN-END:variables private void myInit() { init_key(); init(); start(); } public void do_pass() { } // <editor-fold defaultstate="collapsed" desc="Key"> private void disposed() { this.dispose(); } private void init_key() { KeyMapping.mapKeyWIFW(getSurface(), KeyEvent.VK_ESCAPE, new KeyAction() { @Override public void actionPerformed(ActionEvent e) { // btn_0.doClick(); disposed(); } }); } // </editor-fold> private final DPFPCapture capturer = DPFPGlobal.getCaptureFactory().createCapture(); DPFPDataEvent aw = null; protected void init() { capturer.addDataListener(new DPFPDataAdapter() { @Override public void dataAcquired(final DPFPDataEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { makeReport("The fingerprint sample was captured."); setPrompt("Scan the same fingerprint again."); aw = e; process(e.getSample()); } }); } }); capturer.addReaderStatusListener(new DPFPReaderStatusAdapter() { @Override public void readerConnected(final DPFPReaderStatusEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { makeReport("The fingerprint reader was connected."); } }); } @Override public void readerDisconnected(final DPFPReaderStatusEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { makeReport("The fingerprint reader was disconnected."); } }); } }); capturer.addSensorListener(new DPFPSensorAdapter() { @Override public void fingerTouched(final DPFPSensorEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { makeReport("The fingerprint reader was touched."); } }); } @Override public void fingerGone(final DPFPSensorEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (count == 4) { stop(); } if (count == 1) { jCheckBox1.setSelected(true); } if (count == 2) { jCheckBox2.setSelected(true); } if (count == 3) { jCheckBox3.setSelected(true); } if (count == 4) { jCheckBox4.setSelected(true); } count++; System.out.println("Count: " + count); makeReport("The finger was removed from the fingerprint reader."); } }); } }); capturer.addImageQualityListener(new DPFPImageQualityAdapter() { @Override public void onImageQuality(final DPFPImageQualityEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (e.getFeedback().equals(DPFPCaptureFeedback.CAPTURE_FEEDBACK_GOOD)) { makeReport("The quality of the fingerprint sample is good."); } else { makeReport("The quality of the fingerprint sample is poor."); } } }); } }); } int count = 1; List<Image> fingerprint_list = new ArrayList(); private DPFPTemplate template; public static String TEMPLATE_PROPERTY = "template"; protected void start() { capturer.startCapture(); setPrompt("Using the fingerprint reader, scan your fingerprint."); } protected void stop() { capturer.stopCapture(); } public void makeReport(String string) { jTextArea1.append(string + "\n"); } public void setPrompt(String string) { jTextField1.setText(string); } protected void process(DPFPSample sample) { drawPicture(convertSampleToBitmap(sample)); } public void drawPicture(Image image) { jLabel1.setIcon(new ImageIcon( image.getScaledInstance(jLabel1.getWidth(), jLabel1.getHeight(), Image.SCALE_DEFAULT))); fingerprint_list.add(image); } protected Image convertSampleToBitmap(DPFPSample sample) { return DPFPGlobal.getSampleConversionFactory().createImage(sample); } private void save_list() { List<Image> datas = fingerprint_list; List<S1_test.to_test> to_list = new ArrayList(); for (Image to : datas) { BufferedImage buffered = new BufferedImage(jLabel1.getWidth(), jLabel1.getHeight(), Image.SCALE_DEFAULT); buffered.getGraphics().drawImage(to, 0, 0, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { ImageIO.write(buffered, "jpg", baos); } catch (IOException ex) { Logger.getLogger(Dlg_test.class.getName()).log(Level.SEVERE, null, ex); } byte[] imageInByte = baos.toByteArray(); S1_test.to_test f = new S1_test.to_test(0, imageInByte); to_list.add(f); } S1_test.add_data(to_list); } private void list2() { List<S1_test.to_test> datas = S1_test.ret_data(""); S1_test.to_test to = (S1_test.to_test) datas.get(1); Image img = Toolkit.getDefaultToolkit().createImage(to.finger_print); ImageIcon icon = new ImageIcon(img); jLabel2.setIcon( new ImageIcon(img.getScaledInstance(jLabel2.getWidth(), jLabel2.getHeight(), Image.SCALE_DEFAULT))); BufferedImage img1; try { InputStream input = new ByteArrayInputStream(to.finger_print); OutputStream output = new FileOutputStream("C:\\Users\\Guinness\\Documents\\10.jpg"); IOUtils.copy(input, output); } catch (IOException ex) { Logger.getLogger(Dlg_test.class.getName()).log(Level.SEVERE, null, ex); } verify(); } private void verify() { FileInputStream stream = null; try { File file = new File("C:\\Users\\Guinness\\Documents\\10.jpg"); stream = new FileInputStream(file); byte[] data = new byte[stream.available()]; stream.read(data); stream.close(); DPFPTemplate t = DPFPGlobal.getTemplateFactory().createTemplate(); t.deserialize(data); setTemplate(t); init(); DPFPFeatureSet features = extractFeatures(aw.getSample(), DPFPDataPurpose.DATA_PURPOSE_VERIFICATION); // Check quality of the sample and start verification if it's good if (features != null) { // Compare the feature set with our template DPFPVerificationResult result = verificator.verify(features, t); if (result.isVerified()) { System.out.println("Verified!.."); makeReport("The fingerprint was VERIFIED."); } else { System.out.println("Did not match"); makeReport("The fingerprint was NOT VERIFIED."); } } } catch (FileNotFoundException ex) { Logger.getLogger(Dlg_test.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Dlg_test.class.getName()).log(Level.SEVERE, null, ex); } finally { try { stream.close(); } catch (IOException ex) { Logger.getLogger(Dlg_test.class.getName()).log(Level.SEVERE, null, ex); } } } private DPFPVerification verificator = DPFPGlobal.getVerificationFactory().createVerification(); public void setTemplate(DPFPTemplate template) { DPFPTemplate old = this.template; this.template = template; firePropertyChange(TEMPLATE_PROPERTY, old, template); } protected DPFPFeatureSet extractFeatures(DPFPSample sample, DPFPDataPurpose purpose) { DPFPFeatureExtraction extractor = DPFPGlobal.getFeatureExtractionFactory().createFeatureExtraction(); try { return extractor.createFeatureSet(sample, purpose); } catch (DPFPImageQualityException e) { return null; } } }