BufferedImageとbyteの相互回転

8167 ワード

まず、巨牛巨牛の人工知能のチュートリアルを共有します.私が何気なく発見しました.教程は基础がゼロなだけではなくて、分かりやすくて、その上とても面白くてユーモアがあって、また时々内包の下ネタがあって、小说を読むように、はは~私は勉强している中で、とても牛だと感じて、だからみんなに分かち合います!ここをクリックするとチュートリアルにジャンプできます
               
一、必要なクラス
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);方法は問題をよく解決することができる.
パラメータイメージは、取得した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);//イメージはBufferedImageタイプ
}
paintメソッドを自動的に呼び出す場合は、repaint()メソッドを呼び出す必要があります.
七、実例
要求: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(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); }}

           
人工知能チュートリアルの参照