.NET 4.x Передача матрицы изображения по сети - C#
Формулировка задачи:
Нужно передать картинку с телефона на сервер. Для телефона пиши на Java(Android Studio), а для сервера пишу на C#(Visusl Studio 2010).
В телефонном приложении применяю библиотеку OpenCV, а в серверном Emgu CV. С камеры кадр сохраняю в матрице Mat и нахожу прямоугольные участки(картины). Найденный участок или весь кадр нужно отправить на сервер. Сервер должен принять изображение и обработать.
Проблема возникла в передаче матрицы изображения. Есть кусок кода, неизвестно работает он или нет, т.к. не знаю как преобразовать массив в матрицу. Как преобразовать массив в матрицу? И если не правильно передаю данные, то как правильно передать? Текстовое сообщенис с сервера на телефон нормально передает.
Отправка с телефона.class WorkingClass implements Runnable{
@Override
public void run() {
try {
Socket socket = new Socket("192.168.0.91", 80);
//mRgba - матрица кадра.
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
byte[] byte_array = new byte[(int)(mRgba.total() * mRgba.channels())];
mRgba.get(0, 0, byte_array);
int size = byte_array.length;
int width = (int)mRgba.size().width;
int height = (int)mRgba.size().height;
dOut.writeLong(size);
dOut.writeInt(width);
dOut.writeInt(height);
dOut.write(byte_array);
dOut.flush();
in = new BufferedReader(new InputStreamReader( socket.getInputStream()));
Log.d("Приняли; ", in.readLine());
socket.close();
} catch (Exception ee) {
Log.d("sample application: ", "Fatal ERROR");
Log.d("sample application: ", ee.toString());
}
}
}public void SocketTcpServer()
{
// создаем сокет
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
int port = 80;
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.91"), port);
// связываем сокет с локальной точкой, по которой будем принимать данные
listenSocket.Bind(ipPoint);
// начинаем прослушивание
listenSocket.Listen(10);
IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
byte[] imageByteArray;
while (true)
{
Socket handler = listenSocket.Accept();
// получаем сообщение
StringBuilder builder = new StringBuilder();
byte[] data = new byte[256]; // буфер для получаемых данных
int size = handler.Receive(data);
int width = handler.Receive(data);
int height = handler.Receive(data);
imageByteArray = new byte[(int)size];
builder.Append(Encoding.Default.GetString(imageByteArray, 0, size));
Mat mat = new Mat();
//??? конвертировать массив в матрицу
// отправляем ответ
string message = "ваше сообщение доставлено";
data = Encoding.UTF8.GetBytes(message);
handler.Send(data);
// закрываем сокет
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}Решение задачи: «.NET 4.x Передача матрицы изображения по сети»
textual
Листинг программы
try
{
var tl = new TcpListener(IPAddress.Parse("192.168.0.91"), 80);
tl.Start();
var client = tl.AcceptTcpClient();
using (var ns = client.GetStream())
using (var br = new BinaryReader(ns))
{
while (true)
{
//принимаем размер пакета
count = br.ReadInt32();
//принимаем пакет
byte[] data = br.ReadBytes(count); //Точка отановки процесса.
//разжимаем данные
data = DeCompress(data);
//отправляем данные в очередь принятых данных
lock (incomingData)
incomingData.EnqueueRange(data);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}