1. 程式人生 > >java dubbo 圖片序列化傳輸

java dubbo 圖片序列化傳輸

公司最近用上了 dubbo + spring + redis  , 由於系統 原來用做圖片合成,字型合成操作,在序列化問題上遇到不少麻煩. 圖片合成 ,java 圖片合成是用 bufferedImage來操作的 ,這個BufferedImage 是不支援序列化的 ,就不能在dubbo間傳輸了,問題很大。 經過研究 (需要匯入jai_codec.jar  ,  jai_core.jar 這是 java jai java影象增強包)  例子為:轉為序列化物件,和轉回操作,如果需要轉為bufferedimage ,需要同時快取原 type 圖片型別。這個型別轉換後會丟失(如果設定錯誤,會變色)。  File imageFile = new File("D:\\abcd.jpg");
 BufferedImage picImage = ImageIO.read(imageFile);  int type = picImage.getType(); // type圖片型別
 SerializableRenderedImage serializableRenderedImage = new SerializableRenderedImage(picImage,true);   //轉為可序列化圖片物件   int width = serializableRenderedImage.getWidth();
  int height = serializableRenderedImage.getHeight();   BufferedImage bi = new BufferedImage(width, height,type); 
  
  Graphics2D g = bi.createGraphics();
  g.drawRenderedImage(serializableRenderedImage, AffineTransform.getScaleInstance(1, 1)); //將物件轉回 bufferedImage;1 為縮放比率 ,也就是1比1 不縮放,可按照要求修改
  g.dispose(); //關畫筆,清快取 -------------------------------------------------------------------------------------------------------------------------------------  如果是需要直接輸出圖片檔案,只需要   ImageIO.write(serializableRenderedImage, "jpg", new File("D:\\test.jpg")); 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  將bufferedImage 轉為 SerializableRenderedImage ,這個SerializableRenderedImage 支援序列化,但是這個序列化物件是不能在dubbo 間傳輸的(傳輸後會變得不可用)。  dubbo 的序列化方式與 java原生的不同。  接下來需要 --------------------------------------------序列化---------------------------  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  ObjectOutputStream ops = new ObjectOutputStream(baos);
  ops.writeObject(serializableRenderedImage);
  byte[] byteArray = baos.toByteArray();  // 我們要的結果 二進位制陣列 (這個陣列是可以快取redis的,redis支援二進位制快取,也可以轉為json字串快取)
  ---------------------------------------反序列化-----------------------------
  ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
  ObjectInputStream ois = new ObjectInputStream(bais);
  Object objImage = ois.readObject();
  SerializableRenderedImage sriOut = (SerializableRenderedImage)objImage;    //轉回序列化物件 ----------------------------------------------------------------------------------  dubbo 不能直接傳輸 SerializableRenderedImage 我們用序列化方法序列好後,在dubbo間傳輸byte[] 陣列物件。在需要操作時候,再轉回bufferedImage ------------------------------------------------------------- 知識點: java 序列化要求(可跨工程傳輸): 1.繼承serailzable介面 2.包路徑相同,類完全相同