Java 显示输入流中的图像
我可以从Android手机向电脑发送字符串,反之亦然。但是,我想从我的计算机发送一个图像并将其显示到手机上。在我的例子中,计算机是服务器,手机是客户端 这是我在服务器端代码的一部分:Java 显示输入流中的图像,java,android,sockets,android-imageview,Java,Android,Sockets,Android Imageview,我可以从Android手机向电脑发送字符串,反之亦然。但是,我想从我的计算机发送一个图像并将其显示到手机上。在我的例子中,计算机是服务器,手机是客户端 这是我在服务器端代码的一部分: socket = serverSocket.accept(); dataOutputStream = new DataOutputStream(socket.getOutputStream()); captureScreen("C:\\Users\\HP\\Desktop\\capture.png"); File
socket = serverSocket.accept();
dataOutputStream = new DataOutputStream(socket.getOutputStream());
captureScreen("C:\\Users\\HP\\Desktop\\capture.png");
File f = new File("C:\\Users\\HP\\Desktop\\capture.png");
byte [] buffer = new byte[(int)f.length()];
dataOutputStream.write(buffer,0,buffer.length);
dataOutputStream.flush();
请注意,captureScreen是一种成功获取服务器屏幕截图并将其保存为上述路径中的.PNG图像的方法
现在,在客户端,即Android手机上,如果我有ImageView控件,如何读取从计算机发送的图像作为输入流,并将其显示在ImageView上
此外,我是否成功地将映像写入dataOutputStream?如果有人帮助我,我会很高兴的 可以调用ImageView的setImageBitmapBitmap bm
如何向客户机获取图像数据:这取决于您选择的解决方案,但从技术上讲,您可以使用与纯Java相同的库
您可以使用android.graphics.BitmapFactory从流中创建位图
您可以调用ImageView的setImageBitmapBitmap bm
如何向客户机获取图像数据:这取决于您选择的解决方案,但从技术上讲,您可以使用与纯Java相同的库
您可以使用android.graphics.BitmapFactory从流中创建位图
这是什么
byte [] buffer = new byte[(int)f.length()];
dataOutputStream.write(buffer,0,buffer.length);
您刚刚声明了缓冲区字节数组的大小,但它是空的!
您应该将文件转换为字节,然后将其传输到OutputStream,如下所示:
byte[] buffer = System.IO.File.ReadAllBytes("C:\\Users\\HP\\Desktop\\capture.png");
c代码
然后你会像以前一样发送:
dataOutputStream.write(buffer,0,buffer.length);
dataOutputStream.flush();
请尝试以下方法接收文件:
public void fileReceived(InputStream is)
throws FileNotFoundException, IOException {
Log.i("IMSERVICE", "FILERECCC-1");
if (is!= null) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream("/sdcard/chats/gas1.jpg/");
bos = new BufferedOutputStream(fos);
byte[] aByte = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(aByte)) != -1) {
bos.write(aByte, 0, bytesRead);
}
bos.flush();
bos.close();
Log.i("IMSERVICE", "FILERECCC-2");
} catch (IOException ex) {
// Do exception handling
}
}
}
}
所以你在安卓系统的sd卡上有了新文件。这是什么
byte [] buffer = new byte[(int)f.length()];
dataOutputStream.write(buffer,0,buffer.length);
您刚刚声明了缓冲区字节数组的大小,但它是空的!
您应该将文件转换为字节,然后将其传输到OutputStream,如下所示:
byte[] buffer = System.IO.File.ReadAllBytes("C:\\Users\\HP\\Desktop\\capture.png");
c代码
然后你会像以前一样发送:
dataOutputStream.write(buffer,0,buffer.length);
dataOutputStream.flush();
请尝试以下方法接收文件:
public void fileReceived(InputStream is)
throws FileNotFoundException, IOException {
Log.i("IMSERVICE", "FILERECCC-1");
if (is!= null) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream("/sdcard/chats/gas1.jpg/");
bos = new BufferedOutputStream(fos);
byte[] aByte = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(aByte)) != -1) {
bos.write(aByte, 0, bytesRead);
}
bos.flush();
bos.close();
Log.i("IMSERVICE", "FILERECCC-2");
} catch (IOException ex) {
// Do exception handling
}
}
}
}
所以你的sd卡在Android上会有一个新文件。你能给我提供这个转换的java代码吗?几乎一样,@WassiMZgheiB:Path Path=Path.getpath/to/file;byte[]data=Files.readAllBytespath@重写谢谢,我将这些字节写入了outputStream,但是我如何才能在客户端将它们作为输入流读取?@WassiMZgheiB我在回答中添加了代码,希望它能帮助你。再次感谢,但它不起作用。我的SD卡上没有保存任何内容,我在logcat中得到以下错误:java.net.SocketException:Connection reset by peer:socket write error at java.net.SocketOutputStream.sockettwrite0native Method at java.net.SocketOutputStream.sockettwriteUnknown Source at java.net.SocketOutputStream.writeUnknown Source at java.io.DataOutputStream.writeUnknown Source您能提供给我吗与此转换的java代码几乎相同,@WassiMZgheiB:Path Path=Path.getpath/to/file;byte[]data=Files.readAllBytespath@重写谢谢,我将这些字节写入了outputStream,但是我如何才能在客户端将它们作为输入流读取?@WassiMZgheiB我在回答中添加了代码,希望它能帮助你。再次感谢,但它不起作用。我的SD卡上没有保存任何内容,我在logcat中得到以下错误:java.net.SocketException:Connection reset by peer:socket write error at java.net.SocketOutputStream.sockettwrite0native Method at java.net.SocketOutputStream.sockettwriteUnknown Source at java.net.SocketOutputStream.writeUnknown Source at java.io.DataOutputStream.writeUnknown Source您能告诉我吗关于如何从inputStream创建位图的一些代码?谢谢,但是decodeStreaminputStream不起作用,我认为它返回空值。您可以尝试不同的版本,那里有十几个。null作为返回值表示输入错误。我建议尝试使用本地png文件,例如启动程序图标,它应该可以使用。我已手动将图像放在SD卡上并尝试:位图bMap=BitmapFactory.decodeFileimageName;img.setImageBitmapbMap;是的,你是对的,它是有效的!你能给我提供你如何在SD卡上动态创建图像的代码吗?我想问题要么是1个图像格式jpg vs png,要么是2个网络传输。您可以使用jpg图像尝试相同的方法来检查1。如果可行,请尝试将整个图像加载到字节[],然后调用BitmapFactory.DecodeByteArray。您可以向我展示一些如何从inputStream创建位图的代码吗?谢谢,但decodeStreaminputStream不起作用,我想它返回空值。您可以尝试不同的版本,那里有十几个。null作为返回值表示输入错误。我建议尝试使用本地png文件,例如启动程序图标,它应该可以使用。我已手动将图像放在SD卡上,并尝试:位图bMap=BitmapFactory.decodeFileimageN
ame;img.setImageBitmapbMap;是的,你是对的,它是有效的!你能给我提供你如何在SD卡上动态创建图像的代码吗?我想问题要么是1个图像格式jpg vs png,要么是2个网络传输。您可以使用jpg图像尝试相同的方法来检查1。如果可行,请尝试将整个图像加载到一个字节[],然后调用BitmapFactory.decodeByteArray