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); }}