1. 程式人生 > >BufferedImage與byte 互轉

BufferedImage與byte 互轉

               

一、需要用到的類

java.awt.image.BufferedImage;

javax.imageio.ImageIO;

java.io.*;

二、為什麼要將BufferedImage轉為byte陣列

在傳輸中,圖片是不能直接傳的,因此需要把圖片變為位元組陣列,然後傳輸比較方便;只需要一般輸出流的write方法即可;

而位元組陣列變成BufferedImage能夠還原影象;

三、如何取得BufferedImage

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

四、BufferedImage  ---->byte[]

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

引數image表示獲得的BufferedImage;

引數format表示圖片的格式,比如“gif”等;

引數out表示輸出流,如果要轉成Byte陣列,則輸出流為ByteArrayOutputStream即可;

執行完後,只需要toByteArray()就能得到byte[];

五、byte[] ------>BufferedImage

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

BufferedImage image = ImageIO.read(InputStream in);     //將in作為輸入流,讀取圖片存入image中,而這裡in可以為ByteArrayInputStream();

六、顯示BufferedImage

public void paint(Graphics g){

super.paint(g);

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

}

如果要自動呼叫paint方法,則需要呼叫repaint()方法;

七、例項

要求:編寫一個網路程式,通過Socket將圖片從伺服器端傳到客戶端,並存入檔案系統;

Server端:

package org.exam3;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import
java.io.DataOutputStream;import java.io.File;import java.net.ServerSocket;import java.net.Socket;import javax.imageio.ImageIO;public class T6Server public static void main(String[] args) throws Exception {  ServerSocket server = new ServerSocket(8889);  System.out.println("伺服器開啟連線...埠為8889");  Socket s = server.accept();  while(true){   System.out.println("一客戶端連線伺服器,伺服器傳輸圖片...");   DataOutputStream dout = new DataOutputStream(s.getOutputStream());   BufferedImage image = ImageIO.read(new File("1.gif")); //讀取1.gif並傳輸   ByteArrayOutputStream out = new ByteArrayOutputStream();   boolean flag = ImageIO.write(image, "gif", out);   byte[] b = out.toByteArray();   dout.write(b);   s.close();   System.out.println("圖片傳送完畢,伺服器開啟連線...埠為8889");   s = server.accept();     } }}
Client端:
package org.exam3;import java.awt.BorderLayout;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.File;import java.io.PrintWriter;import java.net.Socket;import javax.imageio.ImageIO;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class T6Client extends JFrame { JButton button; JPanel panel; int count = 0; BufferedImage image ; public T6Client() {  setSize(300, 400);  button = new JButton("獲取影象");  add(button,BorderLayout.NORTH);  button.addActionListener(new ActionListener() {   public void actionPerformed(ActionEvent event) {    try {     Socket s = new Socket("localhost",8889);     PrintWriter out = new PrintWriter(s.getOutputStream());     out.print("a");     DataInputStream in = new DataInputStream(s.getInputStream());     byte[]b = new byte[1024];     ByteArrayOutputStream bout = new ByteArrayOutputStream();     int length = 0;     while((length=in.read(b))!=-1){      bout.write(b, 0, length);     }     ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());     image = ImageIO.read(bin);     repaint();     ImageIO.write(image, "gif", new File("output-"+count+".gif"));     count++;     s.close();    } catch (Exception e) {    }   }  });  panel = new JPanel();  add(panel); } @Override public void paint(Graphics g){  super.paint(g);  g.drawImage(image, 20, 20, 300, 150, null);//image為BufferedImage型別 } public static void main(String[] args) throws Exception {  T6Client frame = new T6Client();  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  frame.setVisible(true); }}