Есть пример?, целый день ебусь с этимпроблема в том, что по сокетам ты не сможешь передать такой большой размер байтов (посмотри на размер картинки).
соответственно тебе нужно как-то уменьшить его, самое логичное что приходит в голову - можешь разбить картинку на части и отправлять по 512 байтов
попробуй какую нибудь либу с гитхаба. когда мне нужно было то скачал с гита рандом либу и битмапы в 2к, тоесть мое разрешение, по 2мб в пнг кидались без проблемЕсть пример?, целый день ебусь с этим
Я уже даже Jpeg юзаю так как мне прозрачность не зачем
Я уже байты картинки пытаюсь делить на части и отправлять по отдельности но особо не выходит
У меня размер картинки в байтах занимает 265882 байт, лимит 65507 через сокетыпопробуй какую нибудь либу с гитхаба. когда мне нужно было то скачал с гита рандом либу и битмапы в 2к, тоесть мое разрешение, по 2мб в пнг кидались без проблем
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);
}
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);
}
}
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;
}
Спасибо решил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; }
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");
}
});
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz