在进行文件保护的时候,格式bmp只能在java的软件中运行,不能再xp系统上运行。为此我们要解决这个问题,首先要知道bmp格式是什么形式保存的,它是以颜色数组保存的。为此就要解决这个问题,在此我犯了一个简单的错误,代码如下:
package saveFile1120;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
public class Save4Bit {
// 用来保存每一个像素点颜色的数组
public int[][] ArrayPic;
private Robot robot;
public void file() {
try {
robot = new Robot();
} catch (Exception ef) {
ef.printStackTrace();
}
}
public void Array2Pinc(Component pc){
// 得到panel左上角的点相对于屏幕的坐标
ArrayPic = new int[pc.getPreferredSize().height][pc.getPreferredSize().width];
Rectangle rect = new Rectangle(pc.getLocationOnScreen().x, pc.getLocationOnScreen().y,
pc.getPreferredSize().width, pc.getPreferredSize().height);
// 从屏幕上抓取一张图片
BufferedImage img = robot.createScreenCapture(rect);
//System.out.println("ooo");
// 获取图像上所有点的颜色,存入数组
for (int i = 0; i < ArrayPic.length; i++) {
for (int j = 0; j < ArrayPic[i].length; j++) {
//数组行列分别与画板的y坐标和x坐标对应
ArrayPic[i][j] = img.getRGB(j, i);
// System.out.println(ArrayPic);
}
}
}
}
我在下面调用robot,而没有在下面不能调用file();而file()没有返回值。在public void Array2Pinc(Component pc)也没有调用这个方法。要把void file()改成Save4bit的构造方法。才能使用,不然会出现这样的错误,代码如下:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
在其中就不要使用泛类队列了,在Save4bit定义了数组,可以获得画布的大小的数组,每一幅画都是有一些像素构成的。而这些像素就相当数组的一个元素,定义数组为int,就可以统一了基本类型。
bmp就是在已选定的区域,引用的是import java.awt.Rectangle;创建对象new Rectangle。其关键作用的是定义的是import java.awt.Robot这个包。在引用import java.awt.Component这个包,它是所用的容器的父类,JPanel就可以使用它。
在遍历的时候应该注意height 和 width应该注意他的顺序,如果你把他搞反,除了一种情况,那就是在长宽一样大的时候。否则错误代码如下:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! at sun.awt.image.IntegerInterleavedRaster.getDataElements(IntegerInterleavedRaster.java:202) at java.awt.image.BufferedImage.getRGB(BufferedImage.java:871) at saveFile1120.Save4Bit.Array2Pinc(Save4Bit.java:31) at saveFile1120.DrawListener.mouseReleased(DrawListener.java:45) at java.awt.Component.processMouseEvent(Component.java:6041) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5806) at java.awt.Container.processEvent(Container.java:2058) at java.awt.Component.dispatchEventImpl(Component.java:4413) at java.awt.Container.dispatchEventImpl(Container.java:2116) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916) at java.awt.Container.dispatchEventImpl(Container.java:2102) at java.awt.Window.dispatchEventImpl(Window.java:2440) at java.awt.Component.dispatchEvent(Component.java:4243) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
可视经过换肤色,换成xp系统的肤色代码如下:
public class DrawUI extends javax.swing.JFrame { ArrayList<NetJavaShape> shapes = new ArrayList<NetJavaShape>(); public static void main(String args[]) { DrawUI kl = new DrawUI(); kl.initDrawUI(); try { UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName()); } catch ( Exception e ) { e.printStackTrace(); } //将界面设置为当前windows风格 kl.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); }
可以经行两幅图片比较,如下: