2013-04-04 108 views
2

我想通過android發送一個圖像作爲字節數組,並將其轉換回服務器端的PNG文件,我得到IllegalArgumentException在服務器端。轉換圖像爲字節數組和反之亦然

這是我的機器人代碼轉換圖像以字節數組,並將其發送作爲請求發送到服務器:

GestureOverlayView gestureView = (GestureOverlayView) findViewById(R.id.signaturePad); 

      Bitmap bm = Bitmap.createBitmap(gestureView.getGesture().toBitmap(100, 100, 8, Color.WHITE)); 

      FileOutputStream fos = openFileOutput("signature.png", Context.MODE_PRIVATE); 
      bm.compress(Bitmap.CompressFormat.PNG, 100, fos); 

      byte[] image_byte = fos.toString().getBytes();//Base64.encode(fos.toString().getBytes(), 0); 

      String strImage = image_byte.toString(); 

這是我的服務器側的程序:

String imageString = request.getParameter("SignatureImage"); 
    byte[] imageByte = imageString.getBytes(); 
    try { 
     InputStream in = new ByteArrayInputStream(imageByte); 
     BufferedImage bImageFromConvert = ImageIO.read(in); 

     //Getting exception at this line 
     ImageIO.write(bImageFromConvert, "png", new File(
       "E:/signature/signature.png")); 
     /*BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageByte)); 
     ImageIO.write(bufferedImage, "jpg", new File("E:/signature/signature.jpg"));*/ 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

在服務器上的例外是:

12:39:40,990 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/APDTest].[ImageRetrieve]] Servlet.service() for servlet ImageRetrieve threw exception: java.lang.IllegalArgumentException: im == null! 
    at javax.imageio.ImageIO.write(ImageIO.java:1457) [:1.6.0_32] 
    at javax.imageio.ImageIO.write(ImageIO.java:1521) [:1.6.0_32] 
    at com.apd.test.ImageRetrieve.doPost(ImageRetrieve.java:52) [:] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final] 
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final] 
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final] 
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final] 
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final] 
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final] 
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final] 
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final] 

回答

2

將圖像寫入客戶端的文件輸出流,該文件將把內容存儲到物理文件中。然後,您嘗試將FileOutputStreamtoString表示形式轉換爲圖像內容。這是行不通的,該類的toString方法不給你寫到流中的內容,它只是打印出樂於助人勉強此類似的消息:

[email protected]

我相信你究竟想要做的是使用一個ByteArrayOutputStream - 這個類確實讓您檢索通過其toString方法寫的實際內容。

在Android上側(片段):

Bitmap bm = Bitmap.createBitmap(gestureView.getGesture().toBitmap(100, 
     100, 8, Color.WHITE)); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(2056); 
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); 

byte[] imageBytes = baos.toByteArray(); 
String encodedString = Base64.encodeToString(imageBytes, Base64.DEFAULT); 

在服務器端(片段):

String imageString = request.getParameter("SignatureImage"); 
byte[] decodedBytes = Base64.decode(imageString, Base64.DEFAULT); 

try { 
    InputStream in = new ByteArrayInputStream(decodedBytes); 
    BufferedImage bImageFromConvert = ImageIO.read(in); 

    ImageIO.write(bImageFromConvert, "png", new File(
      "E:/signature/signature.png")); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
1

試試看看這個代碼。

圖像轉換成字節:對於reference

    yourSelectedImage = BitmapFactory.decodeFile(galleryFilePath);  
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       yourSelectedImage.compress(Bitmap.CompressFormat.PNG, 100, baos); 
       byte[] b = baos.toByteArray(); 

字節轉換成圖像:對於reference

      final String encodedImage = response.toString(); 
      byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT); 
     decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 

希望這會給你一些解決方案。

+0

我並不想保存圖像,並載入它,我試圖捕捉簽名使用手勢放置視圖並將其發送到服務器上點擊按鈕.. – 2013-04-04 08:08:04

相關問題