在Java中操作扫描仪(使用JNI)

作者:    文章来源:

发布日期:2005年01月01日    浏览次数:1次

这是一个用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("");

}

} else {

mSourcesCombo = new JComboBox();

mSourcesCombo.addItem("");

}

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的文件

附件:myTwain.rar(213K)

java可以操作扫描仪吗_在Java中操作扫描仪(使用JNI)相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  3. java word 读取excel数据_在Java中实现读写操作Word、Excel等文件

    Jakarta的POI项目提供了一组操纵Windows文档的Java API,如下几个类提供了操作Excel文件的方便的途径:HSSFWorkbook.HSSFSheet.HSSFRow.HSSFCe ...

  4. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  5. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  6. java课后习题及答案_《java基础入门》课后习题及答案.doc

    <java基础入门>课后习题及答案.doc <Java 基础入门>课后习题及答案博学谷--让 IT 教学更简单,让 IT 学习更有效<Java 基础入门> 课后习题 ...

  7. java状态模式例子答案_[转载]java设计模式_状态模式(带例子)

    状态模式(STATE) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编 ...

  8. java静态类和非静态类_关于java:静态和非静态内部类的区别?

    我正在阅读有效的Java 2 -项目22,它在标题中写道: "Favor static member classes over non-static" 但是在这一章的结尾 Impl ...

  9. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

最新文章

  1. Python自定义主从分布式架构
  2. BZOJ4298 : [ONTAK2015]Bajtocja
  3. 基于SmartQQ协议的QQ聊天机器人-7
  4. Windows 修改hosts文件以及权限问题
  5. 搬砖到年薪百万,是怎样的一种体验?
  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(5)Random Walk 2(推式子+矩阵逆+矩阵乘)
  7. php中的print r与echo,php中echo(),print(),print_r()的区别
  8. kafka 查看待消费数据_通过Kafka Connect进行数据迁移
  9. 常用矩阵求导公式推导
  10. 计算机中央控制单元是由什么组成,电子控制单元由什么组成
  11. 如何把路由器设置为交换机模式来使用
  12. Mac 安装目前最新版本的 macOS Big Sur
  13. Shell脚本自动源码包安装LA/NMP架构详解(赠软件包+脚本)
  14. 表格维护生成器-部分字段不能修改或不能看见
  15. 《视频解密》中文版(第四版) 第七章 数字视频处理(第二部分)
  16. 可视化篇:Echarts3.0引入百度地图(更新)
  17. 区间子集最大/最小异或和问题(线性基,树上差分)
  18. C# Connection:连接数据库
  19. 不标准椭圆顶点坐标计算
  20. 【技术简史】1995-1996 开启的互联网时代范式:信息无处不在

热门文章

  1. 计算机视觉编程-python3-ubuntu16.04
  2. Ace Translator v9 7 0 720 Cracked-ROF
  3. 使用python与采样工具,批量对栅格进行采样,并将采样结果转excel后进行精度分析(2)——使用matlab计算NSE (纳什效率系数NASH)与R2
  4. java中library找不到了,如何解决java.library.path中没有conscrypt_openjdk_jni错误?
  5. 工业控制系统所面临的安全威胁
  6. 小程序使用threejs第五篇—室内效果3D文件的加载,可旋转查看上下四周效果
  7. 人人都是产品经理02-07章摘要
  8. 本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符
  9. 连英文资料都不够权威了,这篇重要的Intel 82801AA AC‘97 声卡的资料居然是德文的,还好我用了360网页翻译
  10. 营销号废话生成器-python