BufferedImage與byte[]互轉

1、須要用到的類

java.awt.image.BufferedImage;

javax.imageio.ImageIO; java

java.io.*; 數組


2、爲何要將BufferedImage轉爲byte數組


在傳輸中,圖片是不能直接傳的,所以須要把圖片變爲字節數組,而後傳輸比較方便;只須要通常輸出流的write方法便可; 服務器

而字節數組變成BufferedImage可以還原圖像; 網絡


3、如何取得BufferedImage


BufferedImage image = ImageIO.read(new File("1.gif")); ide


4、BufferedImage  ---->byte[]


ImageIO.write(BufferedImage image,String format,OutputStream out);方法能夠很好的解決問題; spa

參數image表示得到的BufferedImage; .net

參數format表示圖片的格式,好比「gif」等; orm

參數out表示輸出流,若是要轉成Byte數組,則輸出流爲ByteArrayOutputStream便可; server

執行完後,只須要toByteArray()就能獲得byte[]; 圖片


5、byte[] ------>BufferedImage


ByteArrayInputStream in = new ByteArrayInputStream(byte[]b);    //將b做爲輸入流;

BufferedImage image = ImageIO.read(InputStream in);     //將in做爲輸入流,讀取圖片存入image中,而這裏in能夠爲ByteArrayInputStream();


6、顯示BufferedImage


public void paint(Graphics g){

super.paint(g);

g.drawImage(image,x,y,width,height,null);    //image爲BufferedImage類型

}

若是要自動調用paint方法,則須要調用repaint()方法;


7、實例


要求:編寫一個網絡程序,經過Socket將圖片從服務器端傳到客戶端,並存入文件系統;

Server端:

  1. package org.exam3;  
  2.   
  3. import java.awt.image.BufferedImage;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.DataOutputStream;  
  6. import java.io.File;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9.   
  10. import javax.imageio.ImageIO;  
  11.   
  12. public class T6Server {  
  13.   
  14.     public static void main(String[] args) throws Exception {  
  15.         ServerSocket server = new ServerSocket(8889);  
  16.         System.out.println("服務器開啓鏈接...端口爲8889");  
  17.         Socket s = server.accept();  
  18.         while(true){  
  19.             System.out.println("一客戶端鏈接服務器,服務器傳輸圖片...");  
  20.             DataOutputStream dout = new DataOutputStream(s.getOutputStream());  
  21.             BufferedImage image = ImageIO.read(new File("1.gif"));  //讀取1.gif並傳輸  
  22.             ByteArrayOutputStream out = new ByteArrayOutputStream();  
  23.             boolean flag = ImageIO.write(image, "gif", out);  
  24.             byte[] b = out.toByteArray();  
  25.             dout.write(b);  
  26.             s.close();  
  27.             System.out.println("圖片傳送完畢,服務器開啓鏈接...端口爲8889");  
  28.             s = server.accept();  
  29.               
  30.         }  
  31.     }  
  32. }  

    Client端:
  1. package org.exam3;  
  2.   
  3. import java.awt.BorderLayout;  
  4. import java.awt.Graphics;  
  5. import java.awt.event.ActionEvent;  
  6. import java.awt.event.ActionListener;  
  7. import java.awt.image.BufferedImage;  
  8. import java.io.ByteArrayInputStream;  
  9. import java.io.ByteArrayOutputStream;  
  10. import java.io.DataInputStream;  
  11. import java.io.File;  
  12. import java.io.PrintWriter;  
  13. import java.net.Socket;  
  14.   
  15. import javax.imageio.ImageIO;  
  16. import javax.swing.JButton;  
  17. import javax.swing.JFrame;  
  18. import javax.swing.JPanel;  
  19.   
  20. public class T6Client extends JFrame {  
  21.     JButton button;  
  22.     JPanel panel;  
  23.     int count = 0;  
  24.     BufferedImage image ;  
  25.     public T6Client() {  
  26.         setSize(300400);  
  27.         button = new JButton("獲取圖像");  
  28.         add(button,BorderLayout.NORTH);  
  29.         button.addActionListener(new ActionListener() {  
  30.             public void actionPerformed(ActionEvent event) {  
  31.                 try {  
  32.                     Socket s = new Socket("localhost",8889);  
  33.                     PrintWriter out = new PrintWriter(s.getOutputStream());  
  34.                     out.print("a");  
  35.                     DataInputStream in = new DataInputStream(s.getInputStream());  
  36.                     byte[]b = new byte[1024];  
  37.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();  
  38.                     int length = 0;  
  39.                     while((length=in.read(b))!=-1){  
  40.                         bout.write(b, 0, length);  
  41.                     }  
  42.                     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());  
  43.                     image = ImageIO.read(bin);  
  44.                     repaint();  
  45.                     ImageIO.write(image, "gif"new File("output-"+count+".gif"));  
  46.                     count++;  
  47.                     s.close();  
  48.                 } catch (Exception e) {  
  49.                 }  
  50.             }  
  51.         });  
  52.         panel = new JPanel();  
  53.         add(panel);  
  54.     }  
  55.     @Override  
  56.     public void paint(Graphics g){  
  57.         super.paint(g);  
  58.         g.drawImage(image, 2020300150null);//image爲BufferedImage類型  
  59.     }  
  60.     public static void main(String[] args) throws Exception {  
  61.         T6Client frame = new T6Client();  
  62.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  63.         frame.setVisible(true);  
  64.     }  
  65.   
  66. }  
相關文章
相關標籤/搜索