我正在创建一个应用程序,将图像从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 app)得到了这个例外:
java.lang.IllegalArgumentException:im == null!
at javax.imageio.ImageIO.write(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at com.luugiathuy.apps.remotebluetooth.ProcessConnectionThread.run(ProcessConnectionThread.java:68)
at java.lang.Thread.run(Unknown Source)
所以ImageIO.read()
没有返回任何内容。看起来它不能将字节数组识别为图像。我在互联网上搜索过,但没有什么可以帮我解决这个问题。有没有人有任何想法?
非常感谢!!
答案 0 :(得分:0)
我终于可以搞清楚了!碰巧客户端(Android)创建了一个用于接收的线程和一个用于写入的线程。所以,当我发送图像时,它是以块状发送的,我。即写作线程暂时被Android操作系统暂停,因此服务器端(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();
希望它对某人有帮助。