Вопрос Откравка картинки по сокетам

Monolith Development
Участник
Статус
Оффлайн
Регистрация
8 Мар 2018
Сообщения
542
Реакции[?]
195
Поинты[?]
31K
У меня есть картинка (Bitmap) но я не могу ее отправить
Такая ошибка при использований UDP
1705932254874.png
 
Последнее редактирование:
coder of the year
Участник
Статус
Оффлайн
Регистрация
13 Мар 2019
Сообщения
886
Реакции[?]
266
Поинты[?]
4K
проблема в том, что по сокетам ты не сможешь передать такой большой размер байтов (посмотри на размер картинки).
соответственно тебе нужно как-то уменьшить его, самое логичное что приходит в голову - можешь разбить картинку на части и отправлять по 512 байтов
 
Monolith Development
Участник
Статус
Оффлайн
Регистрация
8 Мар 2018
Сообщения
542
Реакции[?]
195
Поинты[?]
31K
проблема в том, что по сокетам ты не сможешь передать такой большой размер байтов (посмотри на размер картинки).
соответственно тебе нужно как-то уменьшить его, самое логичное что приходит в голову - можешь разбить картинку на части и отправлять по 512 байтов
Есть пример?, целый день ебусь с этим
Я уже даже Jpeg юзаю так как мне прозрачность не зачем
Я уже байты картинки пытаюсь делить на части и отправлять по отдельности но особо не выходит
 
Начинающий
Статус
Оффлайн
Регистрация
19 Авг 2021
Сообщения
43
Реакции[?]
4
Поинты[?]
4K
Есть пример?, целый день ебусь с этим
Я уже даже Jpeg юзаю так как мне прозрачность не зачем
Я уже байты картинки пытаюсь делить на части и отправлять по отдельности но особо не выходит
попробуй какую нибудь либу с гитхаба. когда мне нужно было то скачал с гита рандом либу и битмапы в 2к, тоесть мое разрешение, по 2мб в пнг кидались без проблем
 
Monolith Development
Участник
Статус
Оффлайн
Регистрация
8 Мар 2018
Сообщения
542
Реакции[?]
195
Поинты[?]
31K
попробуй какую нибудь либу с гитхаба. когда мне нужно было то скачал с гита рандом либу и битмапы в 2к, тоесть мое разрешение, по 2мб в пнг кидались без проблем
У меня размер картинки в байтах занимает 265882 байт, лимит 65507 через сокеты
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,020
Реакции[?]
183
Поинты[?]
70K
типа
НО я не уверен что мемкопи скопирует таким образом остатки массива, но вроде норм
Код:
const int max_size = 65507;
auto count = image_size / max_size;
auto last_count = image_size % max_size;
for(int i = 0; i < count + 1; i++ )
{
   if( i == count)
    {
      unsigned char* raw = new unsigned char[last_count];
      memcpy(raw, (image_raw + max_size * i), last_count );
      send(raw);
      break;
    }
  unsigned char* raw = new unsigned char[max_size];
  memcpy(raw, (image_raw + max_size * i), max_size);
  send(raw);
}
 
coder of the year
Участник
Статус
Оффлайн
Регистрация
13 Мар 2019
Сообщения
886
Реакции[?]
266
Поинты[?]
4K
p.s: код писал с телефона, в местах с циклам в клиенте немного запутался, но в целом это примерно то, что должно быть по коду
server:
private void send_img(Socket clientSocket, Bitmap image) {
    int partSize = 65507; // тут лимит сокетов
    int partsCount = (int)Math.Ceiling((double)image.Size.Width * image.Size.Height / partSize);

    for (int i = 0; i < partsCount; i++) {
        int x = (i * partSize) % image.Size.Width;
        int y = (i * partSize) / image.Size.Width;
        int width = Math.Min(partSize, image.Size.Width - x);
        int height = Math.Min(partSize, image.Size.Height - y);

        Rectangle rect = new Rectangle(x, y, width, height);
        Bitmap part = image.Clone(rect, image.PixelFormat);
        MemoryStream ms = new MemoryStream();
        part.Save(ms, ImageFormat.Jpeg);
        byte[] imagePart = ms.ToArray();
    
  clientSocket.Send(imagePart);
    }
}
client:
private Bitmap get_img(Socket serverSocket) {
    int partSize = 65507;
    List<byte[]> imageParts = new List<byte[]>();
    while (true) { // ?? / note: пока не получишь все части картинки
        byte[] imagePart = new byte[partSize];
        int bytesReceived = serverSocket.Receive(imagePart);
        if (bytesReceived == 0) {
            break;
        }
        imageParts.Add(imagePart);
    }

    // собираешь все в одну картинку
    MemoryStream ms = new MemoryStream();
    foreach (byte[] imagePart in imageParts) {
        ms.Write(imagePart, 0, imagePart.Length);
    }
    Bitmap image = new Bitmap(ms);

    return image;
}
 
Monolith Development
Участник
Статус
Оффлайн
Регистрация
8 Мар 2018
Сообщения
542
Реакции[?]
195
Поинты[?]
31K
p.s: код писал с телефона, в местах с циклам в клиенте немного запутался, но в целом это примерно то, что должно быть по коду
server:
private void send_img(Socket clientSocket, Bitmap image) {
    int partSize = 65507; // тут лимит сокетов
    int partsCount = (int)Math.Ceiling((double)image.Size.Width * image.Size.Height / partSize);

    for (int i = 0; i < partsCount; i++) {
        int x = (i * partSize) % image.Size.Width;
        int y = (i * partSize) / image.Size.Width;
        int width = Math.Min(partSize, image.Size.Width - x);
        int height = Math.Min(partSize, image.Size.Height - y);

        Rectangle rect = new Rectangle(x, y, width, height);
        Bitmap part = image.Clone(rect, image.PixelFormat);
        MemoryStream ms = new MemoryStream();
        part.Save(ms, ImageFormat.Jpeg);
        byte[] imagePart = ms.ToArray();
   
  clientSocket.Send(imagePart);
    }
}
client:
private Bitmap get_img(Socket serverSocket) {
    int partSize = 65507;
    List<byte[]> imageParts = new List<byte[]>();
    while (true) { // ?? / note: пока не получишь все части картинки
        byte[] imagePart = new byte[partSize];
        int bytesReceived = serverSocket.Receive(imagePart);
        if (bytesReceived == 0) {
            break;
        }
        imageParts.Add(imagePart);
    }

    // собираешь все в одну картинку
    MemoryStream ms = new MemoryStream();
    foreach (byte[] imagePart in imageParts) {
        ms.Write(imagePart, 0, imagePart.Length);
    }
    Bitmap image = new Bitmap(ms);

    return image;
}
Спасибо решил
C#:
var tcpListener = new TcpListener(IPAddress.Any, 101);

tcpListener.Start();    // запускаем сервер
Console.WriteLine("Сервер запущен. Ожидание подключений... ");

Task.Factory.StartNew(() =>
{
    while (true)
    {
        List<byte[]> imageParts = new List<byte[]>();
        using var tcpClient = tcpListener.AcceptTcpClient();
        Debug.WriteLine($"Входящее подключение: {tcpClient.Client.RemoteEndPoint}");
        int partSize = 65507;
        try
        {
            while (tcpClient.Connected)
            { // ?? / note: пока не получишь все части картинки
                byte[] imagePart = new byte[partSize];
                var stream = tcpClient.GetStream();
                int bytesReceived = stream.Read(imagePart, 0, imagePart.Length);
                if (bytesReceived == 0)
                {
                    break;
                }
                Debug.WriteLine("Recived");
                imageParts.Add(imagePart);
            }
        }
        catch { }

        MemoryStream ms = new MemoryStream();
        foreach (byte[] imagePart in imageParts)
        {
            ms.Write(imagePart, 0, imagePart.Length);
        }
        Bitmap image = new Bitmap(ms);
        image.Save("C:\\Users\\Administrator\\source\\repos\\WebServer\\WebServer\\bin\\Debug\\net8.0-windows7.0\\1.jpg");
    }
});
 
Сверху Снизу