繁体   English   中英

通过蓝牙将图像从android发送到PC

[英]Sending image from android to PC via bluetooth

我正在制作一个应用程序,用于将图像从Android设备发送到在PC上运行的Java应用程序。 客户端(android)上的图像是Bitmap ,为了将其通过蓝牙发送到服务器,我将其转换为Byte Array

 ByteArrayOutputStream baos = new ByteArrayOutputStream();  
 ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
 byte[] b = baos.toByteArray();
 mBluetoothService.write(b);

请注意,位图来自已压缩的文件,因此我不需要再次对其进行压缩。

我在服务器(Java)上使用以下代码:

  byte[] buffer = new byte[1024*1024];
  int bytes;
  bytes = inputStream.read(buffer);
  ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
  BufferedImage image = ImageIO.read(bais);
  ImageIO.write(image, "jpg", new File("c:/users/image.jpg"));

客户端没有错误。 但我在服务器端(Java应用程序)遇到此异常:

java.lang.IllegalArgumentException:im == null!

在javax.imageio.ImageIO.write(未知源)

在javax.imageio.ImageIO.write(未知源)

在com.luugiathuy.apps.remotebluetooth.ProcessConnectionThread.run(ProcessConnectionThread.java:68)

在java.lang.Thread.run(未知来源)

因此ImageIO.read()不返回任何内容。 似乎无法将字节数组识别为图像。 我已经在互联网上进行搜索,但是没有什么可以帮助我解决这个问题。 有谁有想法吗?

非常感谢!!

我终于可以弄清楚了! 碰巧,客户端(Android)创建了一个用于接收的线程和一个用于写入的线程。 因此,当我发送图像时,它是成块发送的,即Android OS会不时暂停写入线程,因此服务器端(Java应用程序)上的inputStream看到的是图像成碎片。 因此, ImageIO.read()不能成功读取图像,而是部分读取图像,这就是为什么我得到“ java.lang.IllegalArgumentException:im == null!”的原因,因为仅凭一个图像就无法创建图像块。

解:

除了图像之外,我还向服务器发送了“文件结尾”字符串,因此它知道文件何时完成(我想对此有更好的方法,但这是可行的)。 在服务器端,在while循环中,我接收所有字节块并将它们全部放在一起,直到收到“文件末尾”。 代码:

Android客户端:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);     
    byte[] b = baos.toByteArray();
    mBluetoothService.write(b);
    mBluetoothService.write("end of file".getBytes());

Java服务器:

    byte[] buffer = new byte[1024];

    File f = new File("c:/users/temp.jpg");
    FileOutputStream fos = new FileOutputStream (f);

    int bytes = 0;
    boolean eof = false;

    while (!eof) {

        bytes = inputStream.read(buffer);
        int offset = bytes - 11;
        byte[] eofByte = new byte[11];
        eofByte = Arrays.copyOfRange(buffer, offset, bytes);
        String message = new String(eofByte, 0, 11);

        if(message.equals("end of file")) {

            eof = true;

        } else {

            fos.write (buffer, 0, bytes);

        }

    }
    fos.close();

希望它能帮助到别人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM