2013-04-04 7 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

Ваша запись изображения в выходной поток файла на вашей стороне клиента, который сохранит содержимое в физическом файле. Затем вы пытаетесь преобразовать toString представление FileOutputStream в качестве содержимого изображения. Это не будет работать, то 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

Я не пытаюсь сохранить изображение и загрузить его обратно, я пытаюсь захватить подписи с использованием жестов над видом наложения и отправки его на сервер при нажатии кнопки. –