package uk.co.mmscomputing.device.twain.memapplet;
import java.awt.Button;
import java.awt.GridLayout;
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
//import javax.imageio.ImageWriter;
//import javax.imageio.IIOImage;
//import javax.imageio.stream.ImageOutputStream;
import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import uk.co.mmscomputing.device.scanner.*;
import uk.co.mmscomputing.device.twain.*;
public class TwainMemApplet extends Applet implements ActionListener, ScannerListener{
static TwainMemApplet app;
static int transferCount = 0;
// assume: no compression
// int twainimgtype = TwainConstants.TWPT_GRAY;
int twainimgtype = TwainConstants.TWPT_RGB;
// int twainimgtype = TwainConstants.TWPT_BW;
File dir = null;
Scanner scanner;
Button acquireButton,selectButton;
public TwainMemApplet(){}
public void init(){
setLayout(new GridLayout(0,2));
selectButton = new Button("select");
add(selectButton);
selectButton.addActionListener(this);
acquireButton = new Button("acquire");
add(acquireButton);
acquireButton.addActionListener(this);
scanner=Scanner.getDevice();
scanner.addListener(this);
try{
File home = new File(System.getProperty("user.home"));
dir = new File(home,"My Documents");
if(!dir.exists()){ dir = home;}
}catch(Exception e){
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent evt){
try{
if(evt.getSource()==acquireButton){
scanner.acquire();
}else if(evt.getSource()==selectButton){
scanner.select();
}
}catch(ScannerIOException se){
se.printStackTrace();
}
}
public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){
if(type.equals(ScannerIOMetadata.MEMORY)){
try{
if(metadata instanceof TwainIOMetadata){ // TWAIN only!
TwainIOMetadata twaindata = (TwainIOMetadata)metadata;
TwainTransfer.MemoryTransfer.Info info=twaindata.getMemory();
byte[] twainbuf = info.getBuffer();
int width = info.getWidth();
int height = info.getHeight();
BufferedImage image = null;
if(twainimgtype == TwainConstants.TWPT_BW){
width = info.getBytesPerRow()*8; // the cheap way out ;)
image = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_BINARY);
byte[] imgbuf = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
System.arraycopy(twainbuf,0,imgbuf,0,imgbuf.length);
}else if(twainimgtype == TwainConstants.TWPT_GRAY){
width = info.getBytesPerRow(); // the cheap way out ;)
image = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
byte[] imgbuf = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();
System.arraycopy(twainbuf,0,imgbuf,0,imgbuf.length);
}else if(twainimgtype == TwainConstants.TWPT_RGB){
image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
/*
Hint:
If using TWPT_RGB - BufferedImage.TYPE_INT_RGB : 3 bytes to 1 int
If using TWPT_RGB - BufferedImage.TYPE_3BYTE_BGR : RGB -> BGR
*/
int bpr = info.getBytesPerRow();
int r, g, b, row=0, pixel=0;
for(int y=0; y<height;y++){
for(int x=0; x<width; x++){
r = twainbuf[pixel++]&0x00FF;
g = twainbuf[pixel++]&0x00FF;
b = twainbuf[pixel++]&0x00FF;
image.setRGB(x,y,(r<<16)|(g<<8)|b);
}
row += bpr;
pixel = row;
}
}
String fn = "image"+transferCount+".png";
File file = (dir!=null)?new File(dir,fn):new File(fn);
System.out.println(file.getCanonicalPath());
ImageIO.write(image, "png", file);
transferCount++;
System.out.println("info = "+info.toString()+"\n");
}
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
transferCount = 0;
ScannerDevice device=metadata.getDevice();
try{
device.setShowUserInterface(false);
device.setShowProgressBar(true);
device.setResolution(100);
if(metadata instanceof TwainIOMetadata){ // TWAIN only!
TwainSource source=((TwainIOMetadata)metadata).getSource();
source.setCapability(TwainConstants.ICAP_PIXELTYPE,twainimgtype);
System.out.println(source.getCapability(TwainConstants.ICAP_PIXELTYPE).toString());
source.setXferMech(TwainConstants.TWSX_MEMORY);
}
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.STATECHANGE)){
System.err.println(metadata.getStateStr());
}else if(type.equals(ScannerIOMetadata.EXCEPTION)){
metadata.getException().printStackTrace();
}
}
public static void main(String[] argv){
try{
app=new TwainMemApplet();
}catch(Exception e){
e.printStackTrace();
}
}
}