1. 程式人生 > >圖片流(BufferedImage)與(ByteArrayInputStream )位元組流互轉

圖片流(BufferedImage)與(ByteArrayInputStream )位元組流互轉

一、需要用到的類

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);    //image為BufferedImage型別

}

七、例項

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

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(8888);
        Socket s = server.accept();
        DataOutputStream dout = new DataOutputStream(s.getOutputStream());
        BufferedImage image = ImageIO.read(new File("1.gif"));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        boolean flag = ImageIO.write(image, "gif", out);
        byte[] b = out.toByteArray();
        dout.write(b);
        s.close();
    }


}

/**********************************/

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.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;
    MyPanel panel;
    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",8888);
                    PrintWriter out = new PrintWriter(s.getOutputStream());
                    out.print("a");
                    DataInputStream in = new DataInputStream(s.getInputStream());
                    byte[]b = new byte[1000000];
                    in.read(b);
                    ByteArrayInputStream bin = new ByteArrayInputStream(b);
                    BufferedImage image = ImageIO.read(bin);
                    ImageIO.write(image, "gif", new File("2.gif"));
                    s.close();
                } catch (Exception e) {
                }
            }
        });
        panel = new MyPanel();
        add(panel);


    }
    public static void main(String[] args) throws Exception {
        T6Client frame = new T6Client();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


}