java dubbo 圖片序列化傳輸
阿新 • • 發佈:2019-01-28
公司最近用上了 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.包路徑相同,類完全相同
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.包路徑相同,類完全相同