这是一个用java来操作扫描仪的小例子:
package edu.ctgu.jtwacker;
import java.awt.borderlayout;
import java.awt.cursor;
import java.awt.dimension;
import java.awt.graphics;
import java.awt.rectangle;
import java.awt.toolkit;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.awt.event.windowadapter;
import java.awt.event.windowevent;
import java.awt.event.windowlistener;
import java.awt.image.bufferedimage;
import java.io.file;
import java.io.fileinputstream;
import javax.swing.jbutton;
import javax.swing.jcombobox;
import javax.swing.jframe;
import javax.swing.jpanel;
import javax.swing.jscrollpane;
import javax.swing.jtoolbar;
import javax.swing.swingutilities;
import com.sun.image.codec.jpeg.jpegcodec;
import com.sun.image.codec.jpeg.jpegimagedecoder;
import edu.ctgu.twain.jtwain;
/*
这是显示扫描图片的frame
*/
public class jtwacker extends jframe {
class jpegpanel extends jpanel {
/** image for the inner class
*/
protected bufferedimage mjpegpanelbufferedimage;
/** pnale to diaply the image
*/
public jpegpanel() {
// no op
}
/** sets the bufferedimage into the class
* @param bi bufferedimage
*/
public void setbufferedimage(bufferedimage bi) {
if (bi == null) {
return;
}
mjpegpanelbufferedimage = bi;
dimension d = new dimension(mjpegpanelbufferedimage.getwidth(this),
mjpegpanelbufferedimage.getheight(this));
setpreferredsize(d);
revalidate();
repaint();
}
/** paints the component.
* @param g graphics object used for the painting
*/
public void paintcomponent(graphics g) {
super.paintcomponent(g);
dimension d = getsize();
g.setcolor(getbackground());
g.fillrect(0, 0, d.width, d.height);
if (mjpegpanelbufferedimage != null) {
g.drawimage(mjpegpanelbufferedimage, 0, 0, this);
}
}
}
protected jpegpanel mjpegpanel;
protected bufferedimage mbufferedimage;
protected jcombobox msourcescombo;
protected jtoolbar mtoolbar;
/** constructor
*/
public jtwacker() {
super("测试");
mjpegpanel = new jpegpanel();
jscrollpane ps = new jscrollpane(mjpegpanel,
jscrollpane.vertical_scrollbar_always,
jscrollpane.horizontal_scrollbar_always);
getcontentpane().add(ps, borderlayout.center);
windowlistener wndcloser = new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
};
addwindowlistener(wndcloser);
mtoolbar = new jtoolbar("twain");
mtoolbar.setfloatable(false);
addbuttons();
getcontentpane().add(mtoolbar, borderlayout.north);
setsize(800, 600);
/* center the frame */
dimension screendim = toolkit.getdefaulttoolkit().getscreensize();
rectangle framedim = getbounds();
setlocation(
(screendim.width - framedim.width) / 2,
(screendim.height - framedim.height) / 2
);
setvisible(true);
}
protected void addbuttons(){
jbutton _ab = new jbutton("扫描");
_ab.addactionlistener(new actionlistener() {
public void actionperformed(actionevent e) {
acquireimage();
}
});
mtoolbar.add(_ab);
mtoolbar.addseparator();
if (edu.ctgu.twain.jtwain.getinstance().istwainavailble()) {
string[] twainsources = jtwain.getinstance().getavailablesources();
if (twainsources != null) {
msourcescombo = new jcombobox(twainsources);
} else {
msourcescombo = new jcombobox();
msourcescombo.additem("<none available>");
}
} else {
msourcescombo = new jcombobox();
msourcescombo.additem("<none available>");
}
mtoolbar.add(msourcescombo);
}
protected void acquireimage() {
if (jtwain.getinstance().istwainavailble()){
if (msourcescombo.getitemcount() > 0 ){
string _source = (string)msourcescombo.getselecteditem();
if (_source != null){
string _filename = jtwain.getinstance().acquire(_source);
system.out.println(_filename);
if (_filename != null && _filename.length() > 0) {
file fchoosen = new file(_filename);
// savetofile(fchoosen);
showimage(fchoosen);
} else {
system.out.println("哎呀,怎么出错了!");
}
} // end if
} // end if
} // end if
}
protected void showimage(final file file) {
if (file == null || !file.exists()) {
return;
}
setcursor(cursor.getpredefinedcursor(cursor.wait_cursor));
thread runner = new thread() {
public void run() {
try {
fileinputstream in = new fileinputstream(file);
jpegimagedecoder decoder = jpegcodec.createjpegdecoder(in);
mbufferedimage = decoder.decodeasbufferedimage();
in.close();
swingutilities.invokelater( new runnable() {
public void run() {
reset();
}
});
}
catch (exception ex) {
ex.printstacktrace();
}
setcursor(cursor.getpredefinedcursor( cursor.default_cursor));
}
};
runner.start();
}
//把扫描得到的图片保存为文件,然后上传到服务器或保存到数据库中
protected void savetofile(final file file) {
try {
file mfile=new file("c://dd.jpg");
if (mfile.exists()) {
mfile.delete();
}else {
file.renameto(mfile);
}
} catch (exception e) {
e.printstacktrace();
// todo: handle exception
}
}
protected void reset() {
if (mbufferedimage != null) {
mjpegpanel.setbufferedimage(mbufferedimage);
}
}
public static void main(string argv[]) {
new jtwacker();
}
}
-------------------------
package edu.ctgu.twain;
/*
这是调用动态链接库的类
*/
public class jtwain {
private static final jtwain minstance = new jtwain();
protected final string dll_name = "jtwain";
private jtwain() {
initlib();
}
public static jtwain getinstance(){
return minstance;
}
public native boolean istwainavailble();
public native string[] getavailablesources();
public native string acquire();
public native string acquire(string sourcename);
private void initlib(){
try {
system.loadlibrary(dll_name);
}catch(exception e) {
e.printstacktrace();
}
finally {
// system.out.println("loading : " + dll_name + ".dll");
}
}
}
实现jtwain.dll的文件
闽公网安备 35060202000074号