仿真bmp格式

在进行文件保护的时候,格式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);
	           }
	       });
	  }

 

可以经行两幅图片比较,如下:

 

 

 

 

 

 

 

 

你可能感兴趣的:(文件保存/bmp格式)