gpt4 book ai didi

java - 如何使用UDP套接字传输jpg图像

转载 作者:行者123 更新时间:2023-11-29 10:01:20 26 4
gpt4 key购买 nike

我想通过 UDP 连接传输 jpg 图像。我想要一个 java 代码将图像转换为字节数组并在另一侧重新创建 jpg 文件。

我试过的代码

图像到字节数组

    BufferedImage img = ImageIO.read(new File("src/test.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
byte[] buffer = baos.toByteArray();
byte[] buff = new byte[1024];
int c=0;

DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("192.168.43.1");
System.out.println(buffer.length);
for(int i=0;i<buffer.length;i++){
buff[c] = buffer[i];
c++;
if(i%1023==0){
DatagramPacket packet = new DatagramPacket(buff, buff.length, IPAddress, 9876);
buff = new byte[1024];
c=0;
clientSocket.send(packet);

System.out.println("sent a mini-packet");
}
}

字节数组转图片

tv = (TextView)findViewById(R.id.recv_message);
try {
DatagramSocket clientsocket=new DatagramSocket(9876);
byte[] receivedata = new byte[1024];
while(true)
{
DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length);
Log.d("UDP", "S: Receiving...");

clientsocket.receive(recv_packet);

byte[] buff = recv_packet.getData();
final Bitmap new_img = BitmapFactory.decodeByteArray(buff, 0,
buff.length);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("received");
ImageView image = (ImageView) findViewById(R.id.test_image);
image.setImageBitmap(new_img);
}
});



InetAddress ipaddress = recv_packet.getAddress();
int port = recv_packet.getPort();
Log.d("IPAddress : ",ipaddress.toString());
Log.d(" Port : ",Integer.toString(port));
}
} catch (Exception e) {
Log.e("UDP", "S: Error", e);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("Error Occured");
}
});
}

最佳答案

发送图片的方式有点问题。最初图像被转换为​​ byte[],然后发送单个字节,即完整的图像被分解并通过不同的较小数据包发送。

现在,当您尝试接收数据包时,这些数据包中的每一个都会被单独接收,并且每次接收到一个小数据包时都会创建一个图像。

例如。让图像为 1024 字节。您正在发送它的各个字节,例如 1,然后 2,..... 1024。在接收它们时,比如接收到数据包 1,它正在使用该单个数据包创建图像。同样,当第二个数据包到达时,正在创建另一个图像。

但是要创建一个完整的 1024 字节的图像。这就是为什么您没有得到想要的结果的原因。

您需要实现一种机制,将它们缓冲到单个字节[] 中,然后形成图像。

现在,只做一件事。以单个单元发送图像,即从图像创建一个 byte[] 并直接发送它,而不会破坏它或从循环中单独发送字节。

 BufferedImage img = ImageIO.read(new File("src/test.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
byte[] buffer = baos.toByteArray();

DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("192.168.43.1");
System.out.println(buffer.length);

DatagramPacket packet = new DatagramPacket(buffer, buffer.length, IPAddress, 9876);

clientSocket.send(packet);

现在,当您收到数据包时,可以形成一个完整的图像,因为所有 1024 个字节将被一次接收。

关于java - 如何使用UDP套接字传输jpg图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26571640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com