![](/img/trans.png)
[英]jpeg image color gets drastically changed after just ImageIO.read() and ImageIO.write()
[英]Java ImageIO.write sends more data than ImageIO.read receives?
我正在嘗試通過套接字發送圖像,我遇到了一個奇怪的問題.ImageIO.write發送的數據比ImageIO.read接收的數據多。 例如,如果我在循環中有以下代碼:
(客戶端)
out.writeByte(222);//magic num for testing
out.writeByte(blockSize);
out.writeByte(x / blockSize);
out.writeByte(y / blockSize);
ImageIO.write(part, "PNG", out);
(服務器端)
if (din.readUnsignedByte() != 222) {
throw new RuntimeException();
}
int partSize = din.readUnsignedByte();
int partX = partSize * din.readUnsignedByte();
int partY = partSize * din.readUnsignedByte();
BufferedImage part = ImageIO.read(din);
在第二次迭代中,幻數將失敗,因為ImageIO.read尚未讀取從另一端發送的所有數據。 為什么是這樣? 這似乎是一個重大問題。 或者我錯過了什么?
編輯:這似乎是一個確認的錯誤,截至2008-04-14。 錯誤ID 6687964 。 為什么沒有這個被解決?唉。
我遇到了同樣的問題。 程序收到文件后,將確認發送回發件人。 如果發送者寫一個轉義字符new String("\\n").getBytes()
然后刷新OutputStream它應該結束緩沖流並允許你到另一端的InputStream.ReadLine()
。 這應該得到多余的數據,循環的下一次重復將獲得新的圖像數據。 我知道這很煩人,但它確實有效
我想出了一個解決方法:
(回合是ByteArrayOutputStream,而不是套接字流)
ImageIO.write(part, "jpg", bout);
out.writeShort(bout.size());
bout.writeTo(out);
bout.reset();
此代碼將在寫入圖像之前將圖像的大小發送為短,從而防止錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.