001 /* 002 * Morena 7 - Image Acquisition Framework 003 * 004 * Copyright (c) 1999-2011 Gnome spol. s r.o. All Rights Reserved. 005 * 006 * This software is the confidential and proprietary information of 007 * Gnome spol. s r.o. You shall not disclose such Confidential 008 * Information and shall use it only in accordance with the terms 009 * of the license agreement you entered into with Gnome. 010 */ 011 012 import java.awt.image.BufferedImage; 013 import java.io.File; 014 import java.io.FileOutputStream; 015 import java.util.ArrayList; 016 import java.util.Arrays; 017 import java.util.Date; 018 import java.util.List; 019 import java.util.logging.Level; 020 021 import javax.imageio.ImageIO; 022 023 import eu.gnome.morena.Camera; 024 import eu.gnome.morena.Configuration; 025 import eu.gnome.morena.Device; 026 import eu.gnome.morena.Manager; 027 import eu.gnome.morena.Scanner; 028 029 /** 030 * MorenaExample demonstrates basic use of the Morena Framework in an 031 * application environment. Process of scanning is asynchronous and application 032 * is provided with the file containing an image. 033 * 034 * Requirements: 1. Java 1.5 or newer 2. Morena7 for image acquisition 035 * 036 */ 037 038 public class MorenaExample { 039 static Manager manager; 040 041 public static void main(String args[]) { 042 MorenaExample example = new MorenaExample(); 043 System.out.println("MorenaExample("+Arrays.toString(args)+") ... started at "+new Date()); // Loads native library and initialize logging 044 try { 045 // Configuration.setLogLevel(Level.ALL); // setting max log detail 046 // Configuration.addDeviceType(".*fficejet.*", true); // workaround for HP scanners 047 manager=Manager.getInstance(); 048 if (args.length == 0) 049 example.simpleScan(); 050 else if (args[0].equalsIgnoreCase("batch")) 051 example.batchScan(); 052 } catch (Throwable ex) { 053 ex.printStackTrace(); 054 } 055 finally { 056 manager.close(); 057 } 058 System.out.println("Finished."); 059 } 060 061 /** 062 * This example method shows how to scan single image from selected device and 063 * default functional unit (flatbed) 064 * 065 * @throws Exception 066 */ 067 private void simpleScan() throws Exception { 068 // Selecting a device (1st device available is selected) 069 List<? extends Device> devices = manager.listDevices(); 070 if (devices.size() > 0) { 071 Device device = devices.get(0); 072 073 if (device != null) { 074 075 // for scanner device set the scanning parameters 076 if (device instanceof Scanner) { 077 Scanner scanner = (Scanner) device; 078 scanner.setMode(Scanner.RGB_8); 079 scanner.setResolution(75); 080 scanner.setFrame(0, 0, 622, 874); // A4 8.3 x 11.7 ( 622 x 877 at 75 DPI) (for Lide110 - 622 x 874) 081 } else 082 if (device instanceof Camera) { 083 // Camera specific settings 084 } 085 086 // start scan using default (0) functional unit 087 BufferedImage bimage = SynchronousHelper.scanImage(device); 088 System.out.println("scanned image info: size=(" + bimage.getWidth() + ", " + bimage.getHeight() + ") bit mode=" + bimage.getColorModel().getPixelSize()); 089 // do image processing if necessary 090 // ... 091 Thread.sleep(30000); 092 } 093 } else 094 System.out.println("No device connected!!!"); 095 } 096 097 098 /** 099 * This example method shows how to scan multiple images from selected device with ADF (automatic document feeder). 100 * If ADF unit is not found or recognized the default unit (0) is used. 101 * Scanned image files are converted to jpeg format and placed in temporary directory (System.getProperty("java.io.tmpdir")) 102 * 103 * @throws Exception 104 */ 105 private void batchScan() throws Exception { 106 List<? extends Device> devices = manager.listDevices(); 107 List<File> filesToDelete = new ArrayList<File>(); 108 if (devices.size() > 0) { 109 Device device = devices.get(0); 110 111 if (device != null) { 112 113 // for scanner device set the scanning parameters 114 if (device instanceof Scanner) { 115 Scanner scanner = (Scanner) device; 116 scanner.setMode(Scanner.RGB_8); 117 scanner.setResolution(200); 118 // find feeder unit 119 int feederUnit=scanner.getFeederFunctionalUnit(); 120 System.out.println("Feeder unit : "+(feederUnit>=0?feederUnit:"none found - trying 0")); 121 if (feederUnit<0) 122 feederUnit=0; // 0 designates a default unit 123 if (scanner.isDuplexSupported()) 124 scanner.setDuplexEnabled(true); 125 126 int pageNo=1; 127 ScanSession session=new ScanSession(); 128 // start batch scan 129 try { 130 session.startSession(device, feederUnit); 131 File file=null; 132 while (null!=(file=session.getImageFile())) { 133 filesToDelete.add(file); 134 // image processing - image file is transformed to JPEG format 135 BufferedImage image = ImageIO.read(file); 136 System.out.println("scanned image "+file.getPath()+" : size=(" + image.getWidth() + ", " + image.getHeight() + ") bit mode=" + image.getColorModel().getPixelSize()); 137 if (!"jpg".equalsIgnoreCase(ScanSession.getExt(file))) { // convert to jpeg if not already in jpeg format 138 File jpgFile=new File(file.getParent(), "Morena_example_img_"+(pageNo++)+".jpg"); 139 FileOutputStream fout=new FileOutputStream(jpgFile); 140 ImageIO.write(image, "jpeg", fout); 141 fout.close(); 142 filesToDelete.add(jpgFile); 143 } 144 } 145 146 } catch (Exception ex) { // check if error is related to empty ADF 147 if (session.isEmptyFeeder()) 148 System.out.println("No more sheets in the document feeder"); 149 else 150 ex.printStackTrace(); 151 } 152 } 153 } 154 System.out.println("Scanning completed - check the images ... waiting 120s"); 155 Thread.sleep(120000); 156 157 // all files are deleted on the exit 158 for (File file : filesToDelete) 159 { file.deleteOnExit(); 160 } 161 } else 162 System.out.println("No device connected!!!"); 163 } 164 165 }