从Java到MATLAB在计算机之间发送图像

用户名

我正在尝试将图像文件从一台PC(客户端)发送到另一台正在运行MATLAB的PC(服务器),并且输出图像为空。

从不同的讨论中,我了解到主要问题是Java和MATLAB之间的“图像矩阵不匹配”。但是,我不完全理解该问题。

如果您能给我一些建议,我将不胜感激。

客户端Java代码:

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import javax.imageio.ImageIO;

public class myclientimage 
{
    public static void main(String args[]) throws IOException
    {
         BufferedImage img = ImageIO.read(new File("D:\\zzz.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.0.102");
         System.out.println(buffer.length);

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

         clientSocket.send(packet);

         System.out.println("aaaa");
    }

}

服务器MATLAB代码:

udpA=udp('192.168.0.104', 9090,'LocalPort', 9091);
fopen(udpA);
A = fread(udpA, 200000);

du = reshape(A,size(A)); % converting vector du to 3d Image array 
imwrite(uint8(du), 'du.jpg'); %save our du to file du.jpg
I = imread('du.jpg'); %test if it saved correctly
imshow(I); 

fclose(udpA);
马赫迪(Mahdi Chamseddine)

好的,这是解决方案。首先需要澄清一些事情,我们将图像作为压缩的jpeg发送,而不是作为独立的像素发送。因此imwrite不能用于此目的,因为它需要图像输入(3D阵列)。然后,您应该fwrite改为使用

另一个(次要的)问题是,BufferedImage以一种方式读取一个字节会给您一个不同的大小,我想您在打印时发现的buffer.length大小与计算机报告的大小不同时会注意到这一点一个解决方案可以在该问题的第二个答案中找到但是,这对图像没有影响(可能会降低质量?),无论有没有链接中提到的解决方案,传输对我来说都是有效的。

正如您在评论中已经提到的那样,您将获得512个双打。因此,基本上有3件事需要完成:

  1. 增加InputBufferSizeUDP对象的大小(默认为512字节)。
  2. 增加InputDatagramPacketSizeUDP对象的大小(默认为8KB),除非您不希望文件大于此大小,否则将分块发送文件。
  3. 将双打转换为uint8,因为这就是您接收双打的方式。

最终的Java代码:

public class SendImageUDP {
  public static void main(String args[]) throws IOException {
    BufferedImage img = ImageIO.read(new File("your_pic.jpg"));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(img, "jpg", baos);
    baos.flush();
    byte[] imageBuffer = baos.toByteArray();
    System.out.println(imageBuffer.length);

    InetAddress IPAddress = InetAddress.getByName("127.0.0.1"); // LocalHost for testing on the same computer
    DatagramSocket clientSocket = new DatagramSocket(9090, IPAddress); // Specify sending socket

    DatagramPacket packet = new DatagramPacket(imageBuffer, imageBuffer.length, IPAddress, 9091);
    clientSocket.send(packet);

    System.out.println("data sent");
    clientSocket.close();
  }
}

最终的MATLAB代码:

clear
close all

%% Define computer-specific variables

ipSender = '127.0.0.1'; % LocalHost for testing on the same computer
portSender = 9090;

ipReceiver = '127.0.0.1'; % LocalHost for testing on the same computer
portReceiver = 9091;

%% Create UDP Object

udpReceiver = udp(ipSender, portSender, 'LocalPort', portReceiver);
udpReceiver.InputBufferSize = 102400; % 100KB to be safe
udpReceiver.InputDatagramPacketSize = 65535; % Max possible

%% Connect to UDP Object

fopen(udpReceiver);
[A, count] = fread(udpReceiver, 102400, 'uint8'); % Receiving in proper format, big size just to be safe
A = uint8(A); % Just making sure it worked correctly

fileID = fopen('du.jpg','w'); % Save as a JPEG file because it was received this way
fwrite(fileID, A);
I = imread('du.jpg'); % Test if it saved correctly
imshow(I); 

%% Close

fclose(udpReceiver);
delete(udpReceiver);

从MATLAB代码中可以看到,不需要重塑接收到的数据,因为它已经是JPEG数据了,无论如何重塑都是没有意义的。只需将其写入文件即可。

资料来源:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在计算机之间发送和接收简单信号?

来自分类Dev

是否可以在同一台计算机上打开的两个 MATLAB 窗口之间发送命令?

来自分类Dev

如何在两台计算机之间发送消息

来自分类Dev

如何在两台计算机之间通过局域网发送文件

来自分类Dev

在两台计算机之间发送大量数据的最佳方法是什么?

来自分类Dev

在两台计算机之间发送带有意外错误字节的结构

来自分类Dev

在计算机之间复制数据的算法

来自分类Dev

远程计算机之间的“无缝”同步?

来自分类Dev

使用Matlab的“ camerParams”(计算机视觉系统工具箱)校正图像

来自分类Dev

Matlab计算机视觉:如何将内存中的图像用于imageSet?

来自分类Dev

移植到多台计算机

来自分类Dev

从本地计算机部署到heroku

来自分类Dev

从网站保存/抓取svg到本地计算机或转换为图像

来自分类Dev

将图像文件夹从本地计算机复制到Firebase存储

来自分类Dev

从网站保存/抓取svg到本地计算机或转换为图像

来自分类Dev

如何在 Python 中将图像从远程服务器复制到本地计算机

来自分类Dev

切换计算机时无法使用Java发送电子邮件吗?

来自分类Dev

在计算机A上生成SSH密钥,并将其用于从计算机B到计算机C的SSH

来自分类Dev

我的计算机在临时网络(计算机到计算机)上的IP地址是什么

来自分类Dev

是否可以在两台单独的计算机之间热交换Java代码?

来自分类Dev

Java FXML:为什么我的imageView没有显示,如何从计算机上载图像?

来自分类Dev

如何使本地计算机在不同端口上的远程计算机之间进行安全复制

来自分类Dev

在两台计算机之间发送电子邮件的最简单方法是什么?

来自分类Dev

使用Java注销计算机

来自分类Dev

使Java程序在计算机的后台运行

来自分类Dev

将MultipartFile转换为java.io.File而不复制到本地计算机

来自分类Dev

将MultipartFile转换为java.io.File而不复制到本地计算机

来自分类Dev

升级到新的计算机后Java.Lang.IllegalAccessError上的所有程序

来自分类Dev

如何将目录从本地计算机复制到远程计算机

Related 相关文章

  1. 1

    在计算机之间发送和接收简单信号?

  2. 2

    是否可以在同一台计算机上打开的两个 MATLAB 窗口之间发送命令?

  3. 3

    如何在两台计算机之间发送消息

  4. 4

    如何在两台计算机之间通过局域网发送文件

  5. 5

    在两台计算机之间发送大量数据的最佳方法是什么?

  6. 6

    在两台计算机之间发送带有意外错误字节的结构

  7. 7

    在计算机之间复制数据的算法

  8. 8

    远程计算机之间的“无缝”同步?

  9. 9

    使用Matlab的“ camerParams”(计算机视觉系统工具箱)校正图像

  10. 10

    Matlab计算机视觉:如何将内存中的图像用于imageSet?

  11. 11

    移植到多台计算机

  12. 12

    从本地计算机部署到heroku

  13. 13

    从网站保存/抓取svg到本地计算机或转换为图像

  14. 14

    将图像文件夹从本地计算机复制到Firebase存储

  15. 15

    从网站保存/抓取svg到本地计算机或转换为图像

  16. 16

    如何在 Python 中将图像从远程服务器复制到本地计算机

  17. 17

    切换计算机时无法使用Java发送电子邮件吗?

  18. 18

    在计算机A上生成SSH密钥,并将其用于从计算机B到计算机C的SSH

  19. 19

    我的计算机在临时网络(计算机到计算机)上的IP地址是什么

  20. 20

    是否可以在两台单独的计算机之间热交换Java代码?

  21. 21

    Java FXML:为什么我的imageView没有显示,如何从计算机上载图像?

  22. 22

    如何使本地计算机在不同端口上的远程计算机之间进行安全复制

  23. 23

    在两台计算机之间发送电子邮件的最简单方法是什么?

  24. 24

    使用Java注销计算机

  25. 25

    使Java程序在计算机的后台运行

  26. 26

    将MultipartFile转换为java.io.File而不复制到本地计算机

  27. 27

    将MultipartFile转换为java.io.File而不复制到本地计算机

  28. 28

    升级到新的计算机后Java.Lang.IllegalAccessError上的所有程序

  29. 29

    如何将目录从本地计算机复制到远程计算机

热门标签

归档