處理我有一個Android應用程序需要的照片,將它們轉換利用爲位圖:照片無法通過的ImageIO
private Bitmap generateBitmap(byte[] data) {
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix mat = new Matrix();
mat.postRotate(-90);
return Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), mat, true);
}
然後PNG使用:
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
然後將outputStream
發佈(multipart/form-data)到我的web服務器(jboss)。在服務器上,JAX-RS和MultipartForm它轉換成一個數據[],併發送爲開頭的額外處理:
BufferedImage image = ImageIO.read(new ByteArrayInputStream(form.getImageFileData()));
應用程序是在生產,工作正常,一直到現在。我們激活上週(三星Galaxy Note EDGE)和每一張照片他上傳生成javax.imageio.IIOException: Error reading PNG image data
當調用ImageIO.read()在堆棧跟蹤的根本原因是新用戶:
Caused by: java.util.zip.ZipException: incorrect data check
的照片顯示正常在瀏覽器中,但由於此例外,我無法完全處理它們。我也可以在編輯器中打開它們,將它們旋轉360度,重新保存它們,然後處理它們就好了。
任何人都可以幫助我理解什麼可能會導致此問題在這一臺設備上,或建議我可以在服務器上做些什麼來解決它,仍然生成我需要進一步處理的BufferedImage
?手動編輯每張照片不是一種選擇。
更新:如建議,我跑了pngcheck從這個設備的14張照片。它返回了2個有效的和12個無效的錯誤:zlib: inflate error = -3 (data error)
。如上所述,所有14個使用ImageIO失敗。
這個問題的圖像可以看出:https://tracweb-safecommunity.rhcloud.com/rest/monitoredProfile/106/testResult_8284.png
'引起︰java.util.zip.ZipException:不正確的數據檢查' - PNG文件不是ZIP文件。 – CommonsWare
a)圖像有各種不同的類型 - 也許這個圖像不被imageio識別 - 你必須開始閱讀像素字節並重建圖像b)這個png是否可以作爲圖像顯示?那麼它可能是字節的傳輸bitmap.compress(Bitmap.CompressFormat.PNG,100,outputStream); – gpasch
因此,bitmap.compress在這款手機上的功能不同,或者ImageIO不喜歡這款手機中所有照片的獨特之處?兩者似乎都不太可能,但這也是我想出的。除非任何人有更好的主意,否則我可以爲這個使用jpg代替png的人創建一個測試應用程序。 – Jonathon