分享

在Java中操作扫描仪(使用JNI)_JAVA专栏_程序开发_技术部落--打造最全面的IT技术网站_Jsbulo.com

 ShangShujie 2007-09-22
在Java中操作扫描仪(使用JNI)
  2007-3-14  来源:网络资源  编辑:Jsbulo  热度: 35

这是一个用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的文件

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约