从InputStream显示图像

3

我能够在我的安卓手机和电脑之间发送字符串,但是我想要从电脑向手机发送图片并显示出来。在我的情况下,电脑是服务器,手机是客户端。

这是我服务器端的代码的一部分:

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控件,如何将从计算机发送的图像作为InputStream读取并显示在ImageView上?
此外,我是否成功地将图像写入dataOutputStream?如果有人能帮助我,我会很高兴!
2个回答

5
你可以调用 ImageView 的 setImageBitmap(Bitmap bm) 方法。

http://developer.android.com/reference/android/widget/ImageView.html

你如何将图像数据传输给客户端:这取决于你选择的解决方案,但在技术上,你可以使用与纯Java相同的库。你可以使用android.graphics.BitmapFactory从流中创建Bitmap。

http://developer.android.com/reference/android/graphics/BitmapFactory.html

Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream);
Bitmap bitmap2 = BitmapFactory.decodeFile(filename);

请问您能否展示一下如何从输入流中创建位图的代码? - WassiM ZgheiB
3
谢谢,但是decodeStream(inputStream)没有起作用,我认为它返回了null。 - WassiM ZgheiB
你可以尝试不同的版本,那里有十几个版本可供选择。如果返回值为 null,则表示输入有误。我建议使用本地的 png 文件(例如启动器图标)进行尝试,应该可以正常工作。 - gaborsch
我手动将图像放到sdcard上并尝试了以下操作: Bitmap bMap = BitmapFactory.decodeFile(imageName); img.setImageBitmap(bMap);是的,你说得对,它可以工作!你能否提供我动态在sdcard上创建图像的代码? - WassiM ZgheiB
我认为问题可能出在(1)图像格式(jpgpng)或(2)网络传输方面。您可以尝试使用jpg图像进行相同的操作以检查(1)。如果它可以工作,那么请尝试将整个图像加载到byte[]中,然后调用BitmapFactory.decodeByteArray()函数。 - gaborsch
另外,你可以尝试为你的png文件打开一个FileInputStream,然后将其传递给BitmapFactory.decodeStream(inputStream) - gaborsch

1
这是什么?
    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();

try this for file receiving :

    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卡中有了新文件。


请问您能提供这个转换的Java代码吗? - WassiM ZgheiB
几乎相同,@WassiMZgheiB: `Path path = Paths.get("path/to/file"); byte[] data = Files.readAllBytes(path);` - Overrided
@覆盖谢谢,我将这些字节写入了outputStream,但是客户端如何将它们作为inputStream读取? - WassiM ZgheiB
@WassiMZgheiB 我在我的回答中添加了代码,希望它能帮到你。 - Overrided
再次感谢,但它没有起作用,我的SD卡上没有保存任何内容,我在logcat中得到了以下错误:java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(Unknown Source) at java.net.SocketOutputStream.write(Unknown Source) at java.io.DataOutputStream.write(Unknown Source) - WassiM ZgheiB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接