Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
1

Получение фото с веб камеры, занесение его в Bitmap и преобразование Bitmap в массив

27.05.2017, 15:26. Просмотров 1721. Ответов 26
Метки нет (Все метки)

В общем необходимо подключиться к веб камере сделать снимок и отправить его в сеть.
Задачу я разделил на несколько этапов.
1. Сам снимок.
2. Занесение его в BITMAP.
3. Преобразование BITMAP в char.
4. Отправка массива в сеть с помощью winsock.

С первым и четвертым пунктом все нормально, а вот со вторым и третьим проблемы.
Есть грубый код, но либо неправильно передаю параметры функций, либо что то упустил и не дописал, т.к. первый раз этим занимаюсь. Подскажите в чем мое упущение. Спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#pragma comment( lib, "Vfw32.lib" )
#pragma comment( dll, "mscorlib.dll" )
#include<windows.h>
#include<vfw.h>
#include<jpeg.hpp>
#include<registry.hpp>
#include<iostream.h>
HWND hWndC;
HWND    hwndParent;
 HANDLE handle;
 
void main()
{
 
hWndC = capCreateCaptureWindow ( NULL,SW_HIDE, 0, 0, 0, 0, hwndParent, 0);
 
capDriverConnect (hWndC, 0);//соединение с драйвером веб камеры
capGrabFrame(hWndC);// берем и делаем кадр
//тут код просто для сохранения в файл для сравнения результата со следующей частью кода
        std::string filename="frame.bmp";
    char buffer [33];
    itoa (0,buffer,10);
    filename.insert(5,buffer);
    capFileSaveDIB(hWndC,filename.data());
 
//-------------------------------------------------------------
HDC hdc = GetDC(hWndC); //DC текущего окна
HDC hDC = CreateCompatibleDC(hdc); // Memory DC
HBITMAP Bitmap = CreateCompatibleBitmap(hdc, 550, 600); //создаем пустой bitmap
SelectObject(hDC, Bitmap); //выбираем bitmap
BitBlt(hDC,0,0,550,600,hdc,0,0,SRCCOPY);//заполняем его
 
//далее код с которым у меня неразбериха. Суть в том чтобы запихнуть мое изображение из bitmap в  char массив для отправке в сеть с помощью сокетов
// код состоит из двух частей. первая загоняет фото в буфер а вторая извлекает и сохрняет в файл( по сути клиент и сервер мой)
 
  BITMAPINFO bmi;// инициализация информационной структуры моего bitmap
  BYTE *buff;
  int buffsize;
  bmi.bmiHeader.biSize=sizeof(bmi.bmiHeader);
  bmi.bmiHeader.biBitCount=0;
  //этим вызовом заполняем поля bmi
  int ret=GetDIBits(hDC, Bitmap,0,550,NULL,&bmi,DIB_RGB_COLORS);
 
  buffsize=bmi.bmiHeader.biSizeImage;
  buff=new BYTE[buffsize];
  //а вот этим уже захватываем битовые данные в buff
  ret=GetDIBits(hDC, Bitmap,0,550,buff,&bmi,DIB_RGB_COLORS);
  //--------------------
  //преобразования buff
  //--------------------
  Graphics::TBitmap* im2 = new Graphics::TBitmap;
  im2->PixelFormat = pf24bit;
  im2->Width = 600;
  im2->Height = 550;
  HBITMAP hIm=im2->Handle;
  int j = SetDIBits(im2->Canvas->Handle,hIm,0,550,buff,&bmi,DIB_RGB_COLORS);
  im2->SaveToFile("out.bmp");
 
 
 
 system("pause");
  }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2017, 15:26
Ответы с готовыми решениями:

создание Clone с Bitmap меньшего размера с сохранением изначальных габаритов Bitmap
Взялся за GDI, столкнулся с проблемой. Есть &quot;бегущая строка&quot;, она движется справа налево. Если...

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по координатам пикселей) другого...

Получить bitmap картинку с камеры
Скажите пожалуйста, как получить всего одну картинку с веб-камеры. Интересует именно минимальный,...

Нарисовать прошлый Bitmap на новом так, чтобы небыл растянут рисунок, если новый Bitmap больше размером
Короче пытался сделать такое дело: Рисую фигуры на форме, когда отпускаю левую кнопку мыши (когда...

26
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
28.05.2017, 22:48  [ТС] 2
В общем проблему я решил, но появилась другая. При создании окна захвата, я использую параметр SW_HIDE (скрываю окно) поэтому на выходе вместо второго сохраненного изображения получал черный квадрат. Как только исправил на WS_VISIBLE все заработало.Видимо тут критично, чтобы окно прорисовалось. Теперь новый вопрос, как скрыть окно и не потерять изображение?
0
Заблокирован
28.05.2017, 23:58 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void main()
{
    //hWndC = capCreateCaptureWindow (NULL, SW_HIDE, 0, 0, 0, 0, hwndParent, 0);
 
    WNDCLASS wndclass;
    wndclass.style = 0;
    wndclass.lpfnWndProc = DefWindowProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = GetModuleHandle(NULL);
    wndclass.hIcon = NULL;
    wndclass.hCursor = NULL;
    wndclass.hbrBackground = NULL;
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = "WSCLAS";
    RegisterClass(&wndclass);
 
    /* Cоздать окно захвата, скрыто внутри невидимого родительского окна. */
    HWND hwnd,hwndCap;
    hwnd=CreateWindow("WSCLAS","",0,0,0,1,1,
        HWND_DESKTOP,NULL,GetModuleHandle(NULL),NULL);
    if(NULL==hwnd) {
        return;/* Не удалось создать родительское окно. */
    }
    hwndCap=capCreateCaptureWindow("App Name",WS_CHILD,0,0,640,480,hwnd,1);
    if(NULL==hwndCap) {
        DestroyWindow(hwnd);
        return;/* Не удалось создать окно захвата. */
    }
 
        
 
    system("pause");
 
}
0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
29.05.2017, 14:54  [ТС] 4
Не помогло. все равно получаю на выходе черный квадрат.
0
Заблокирован
29.05.2017, 15:06 5
Захват видео с камеры
0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
30.05.2017, 09:32  [ТС] 6
В общем задачу я решил. Я сначала убрал рамки окна захвата,потом сделал его прозрачным. Далее сделал это окно дочерним окном рабочего стола и убрал на задний план. Вот. Но к сожалению мне необходимо было занести все в цикл чтобы получилось что то на подобии видео потока то есть создать снимок с камеры засунуть в буфер отправить в сеть и все по новой, но на деле все работает слишком медленно. А надо 25 кадров в секунду. Буду думать уже, может через directshow пробовать. Большое спасибо за помощь, потом уже выложу готовый вариант, может кому пригодится.
0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
03.06.2017, 08:45  [ТС] 7
И снова вопрос, на данный момент реализовал следующее: захват камеры, снимок,конвертация изображения в массив передача по сети, прием, конвертация в jpg/bmp. На приеме у меня обычное оконное приложение. Вот тут закрался вопрос. Для того чтобы не грузить основное приложение я вывел прием и визуализацию картинки в поток:
C++
1
DWORD WINAPI  ThreadR(LPVOID param){.....}
Из этого потока я пытаюсь сделать следующее:
C++
1
2
3
4
5
6
recvfrom(udpsock,bytes,k,0,(SOCKADDR*)&cludp,&sizecladdr);
  stream2->WriteBuffer(bytes,k);
 
    stream2->Position=0;
    out_jpg->LoadFromStream(stream2);
    out_jpg->Canvas->Draw(0,0,PaintBox1);
При обращении к PaintBox приложение зависает и вылетает.
Знает может кто, как исправить или как изображение вывести на экран вообще(например создать вручную свое окно и выводить в него?...не знаю как реализовать)
0
nmcf
03.06.2017, 09:10
  #8

Не по теме:

Никогда из потоков просто так не обращались к элементам окна. Везде свои способы.

0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
03.06.2017, 14:50  [ТС] 9
Например? А как обратиться не просто так?
0
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
03.06.2017, 17:57 10
Доступ к компонентам формы из потока
1
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
06.06.2017, 22:34  [ТС] 11
Уважаемые я немножечко в панике через три дня надо сдавать уже преподавателю работу!
В общем не стал заморачиваться с потоками, а сделал следующее. Моя программа в общем представляет клиен сервер.
С клиента я подключаюсь к серверу и отдаю команду. Сервер начинает отправлять изображение, а клиент открывает отдельную программу с paintbox которая должна принять данные и отобразить их. Вот, но ничего не отображается....... Очень прошу помощи.

Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
SOCKET videosock;
sockaddr_in videoaddr;
videosock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
videoaddr.sin_family=AF_INET;
videoaddr.sin_port=htons(20000);
videoaddr.sin_addr.S_un.S_addr=client_addr.sin_addr.S_un.S_addr;
 
 
HWND hWndC;
HWND hwndParent;
   hWndC = capCreateCaptureWindow ( NULL,WS_EX_NOACTIVATE|WS_POPUP | WS_VISIBLE, 0, 0, 640, 480, hwndParent, 0);
//SetWindowLong(hWndC, GWL_HWNDPARENT, (LONG)::GetDesktopWindow());
//SetWindowLong (hWndC, GWL_EXSTYLE, GetWindowLong(hWndC, GWL_EXSTYLE) | WS_EX_LAYERED);
//SetLayeredWindowAttributes (hWndC, 0, 0, LWA_ALPHA);
capDriverConnect (hWndC, 0);
TJPEGImage * jpg=new TJPEGImage;
Graphics::TBitmap* bmp=new Graphics::TBitmap;
bmp->Width =640;
bmp->Height =480;
TMemoryStream *ms=new  TMemoryStream;
int bufize;
char *bytes;
int k;
AnsiString dlin;
char *buff;
    
     
        while(1)
           {
            capGrabFrame(hWndC);
                        char buffer [33];
            HDC hdc = GetDC(hWndC);
            SetStretchBltMode(hdc,HALFTONE);
            StretchBlt(bmp->Canvas->Handle,0,0,bmp->Width,bmp->Height,hdc,0,0,bmp->Width,bmp->Height,SRCCOPY);
            bmp->SetSize(bmp->Width,bmp->Height);
            jpg->Assign(bmp);
            jpg->CompressionQuality=26;
            jpg->Compress();
            
            jpg->SaveToStream(ms);
            
            bytes = new byte[ ms->Size];
            bytes=(byte*)(ms->Memory);
            k=ms->Size;
            dlin+=" ";
            dlin+=k;
            dlin+=" ";
            buff=dlin.c_str();
int sent_err=sendto(videosock,buff,sizeof(buff),0,(SOCKADDR*)&videoaddr,sizeof(videoaddr));
           if(sent_err==SOCKET_ERROR)
             {
              int yh=GetLastError();
                          cout<<yh<<endl;
              cout<<"Cannot send an answer for udp."<<endl;
 
              closesocket(videosock);
 
             }
           else
               {
                cout<<"send size"<<endl;
 
 
               }
 sent_err=sendto(videosock,(char*)&bytes,k,0,(SOCKADDR*)&videoaddr,sizeof(videoaddr));
           if(sent_err==SOCKET_ERROR)
             {
              int yh=GetLastError();
 
              cout<<yh<<endl;
              cout<<"Cannot send img."<<endl;
 
              closesocket(videosock);
 
             }
           else
               {
                cout<<"send"<<endl;
 
               }
               ms->Clear();
 
           ms->Position=0;
              buff="";
              bytes="";
              dlin=NULL;
          }
          
 
 
 }
Сначала сервер отправляет размер картинки а потом саму картинку





клиент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
WSAStartup(MAKEWORD(2,2),&wsa);
udpsock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  if(udpsock==SOCKET_ERROR)
  {
  Memo1->Lines->Add("udpSocket Initialization error");
  }
udpaddr.sin_family=AF_INET;
udpaddr.sin_port=htons(20000);
udpaddr.sin_addr.S_un.S_addr=INADDR_ANY;
int uderr=bind(udpsock,(SOCKADDR*)&udpaddr,sizeof(udpaddr));
  if(uderr==SOCKET_ERROR)
  {
  Memo1->Lines->Add("udp bind error");
  }
}
//---------------------------------------------------------------------------
 
void play()
{
  Sleep(2000);
  sockaddr_in cludp;
 
while(1)
  {
    sizecladdr=sizeof(cludp);
  recvfrom(udpsock,klbuf,sizeof(klbuf),0,(SOCKADDR*)&cludp,&sizecladdr);
  jppgsize+=klbuf;
  nachvidsize=jppgsize.Pos(' ');
  jppgsize.Delete(1,nachvidsize);
  nachvidsize=jppgsize.Pos(' ');
  jpgsizestr=jppgsize.SubString(1,nachvidsize-1);
  kl=atoi(jpgsizestr.c_str());
  recvfrom(udpsock,buf,kl,0,(SOCKADDR*)&cludp,&sizecladdr);
  stream2->Position=0;
  stream2->WriteBuffer(buf,kl);
  stream2->Position=0;
  out_jpg->LoadFromStream(stream2);
 PaintBox1->Canvas->Draw(0,0,out_jpg);
  klbuf="";
  buf="" ;
  stream2->Clear();
 
  }
 
 }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
play();
}

Клиент должен принимать первый пакет с размерам...если в буфере пришел еще мусор..я сделал так чтобы вытащить непосредственно значение размера картинки. Ну и потом принимается картинка...и ничего не происходит...
0
nmcf
06.06.2017, 22:45
  #12

Не по теме:

Т. е. вместо допиливания ты всё усложнил. И почему на WinAPI? В Builder же есть компоненты для сетевого взаимодействия.

0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
07.06.2017, 07:49  [ТС] 13
Мне потом надо будет вообще перейти на сырые сокеты, для ручной конфигурации пакетов.


А допиливать.....я не знаю как правильно работать с TThread. Нет времени на теоретическую часть этого вопроса.(


Цитата Сообщение от anon478 Посмотреть сообщение
jpg->Assign(bmp);
jpg->CompressionQuality=26;
jpg->Compress();
jpg->SaveToStream(ms);
bytes = new byte[ ms->Size];
bytes=(byte*)(ms->Memory);
В общем покопался и понял что из потока в массив ничего не записывается на сервере.
0
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
07.06.2017, 21:31 14
Выделяешь память, а после присваиваешь посторонний адрес? Зачем?
C++
1
2
            bytes = new char [ms->Size];
            bytes=(char*)(ms->Memory);
А это для чего?
C++
1
2
3
            dlin+=k;
            buff=dlin.c_str();
int sent_err=send(videosock,buff,sizeof(buff),0);//отправка размера изображения
Хочешь длину передать, передавай сразу k.
C++
1
send(videosock, reinterpret_cast<char *>(&k), sizeof(k), 0);
1
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
17.06.2017, 20:53  [ТС] 15
В общем пока есть время между зачетами пытаюсь добить программу, но видно мозгов маловато.
Изображение заносится в поток отправляется(смотрел через wireshark,хотя из перехваченных пакетов не смог собрать картинку) вот. Так к чему я, ах да в общем изображение не выводится (либо размер который принимаю равен 0 и как следствие выскакивает ощибка jpeg error 42). Посмотрите пожалуйста.

Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
jpg->SaveToStream(ms);
int k=ms->Size;
int sent_err=send(videosock, reinterpret_cast<char *>(&k), sizeof(k), 0);
           if(sent_err==SOCKET_ERROR)
             {
              int yh=GetLastError();
              cout<<yh<<endl;
              cout<<"Cannot send an answer for udp."<<endl;
              closesocket(videosock);
             }
           else
               {
                cout<<"send size"<<endl;
               }
 sent_err=send(videosock,reinterpret_cast<char *>(ms->Memory), ms->Size,0);
           if(sent_err==SOCKET_ERROR)
             {
              int yh=GetLastError();
              cout<<yh<<endl;
              cout<<"Cannot send img."<<endl;
              closesocket(videosock);
             }
           else
               {
                cout<<"send"<<endl;
               }
               ms->Clear();
           ms->Position=0;

Клиент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
WSAStartup(MAKEWORD(2,2),&wsa);
server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
if(server==SOCKET_ERROR)
  {
  Memo1->Lines->Add("Create socket error");
  }
 
 
sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(20000);
sockaddr.sin_addr.S_un.S_addr=INADDR_ANY;
int bind_err = bind( server, (SOCKADDR*)&sockaddr, sizeof(sockaddr) );
if(bind_err==SOCKET_ERROR)
  {
  Memo1->Lines->Add("Bind error");
  }
 
int listen_err = listen( server, 1);
if(listen_err==SOCKET_ERROR)
  {
  Memo1->Lines->Add("listen error");
  }
 
 
int client_addrlen=sizeof(client_addr);
Memo1->Lines->Add("Waiting for client connecting");
client=accept(server,(struct sockaddr*)&client_addr,&client_addrlen);
if(client==SOCKET_ERROR)
  {
  Memo1->Lines->Add("Accept_error");
 
  }
else
   {
   Memo1->Lines->Add("Connected");
  }
 
//------------------------------------------------------------------------------
 
recv(client,klbuf,sizeof(klbuf),0);
  int k=10000;//atoi(klbuf);
 
  stream2->Position=0;
 while(1)
 {
  recv(client,reinterpret_cast<char *>(stream2->Memory),k,0);
  if(stream2->Size>k )
  {break;}
 }
 
 
     stream2->Position=0;
      out_jpg->LoadFromStream(stream2);
     // out_jpg->SaveToFile("ko.jpg");
      PaintBox1->Canvas->Draw(0,0,out_jpg);
 
 
 
  stream2->Clear();
 
 
}
Добавлено через 14 минут
Первое что думаю это задать размер потока stream2->SetSize(k)..но k=0 не знаюв общем что делать должно приняться до 20 сегментов tcp пакета.
0
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
17.06.2017, 23:42 16
Почему у тебя постоянно к тексту всё приходит? Приём такой же как передача.
C++
1
recv(client, reinterpret_cast<char *>(&k), sizeof(k), 0);
0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
18.06.2017, 04:43  [ТС] 17
Размер получил нормально, хорошо. При приеме самой информации вообще можно пользоваться такой же конструкцией
C++
1
recv(client, reinterpret_cast<char *>(stream2->Memory), sizeof(k), 0);
если да то как ставить размер sizeof(k) в этом случае.

или может надо все таки через массив
C++
1
2
3
4
что то типо
 
recv(client,buffer,len,0);
stream2->writebuffer(buffer,len);
в общем в одном и другом случае при попытке загрузить поток в jpeg выдает ошибки(jpeg eror в частности 53(неправильное изображение)..ну еще бывало 51,42)
C++
1
img_out->LoadFromStream(stream2) //jpeg error
Добавлено через 1 час 25 минут
Итак 4.51 утра и......есть контакт изображение передается и воспроизводится...загнал его в цикл и получилось видео длинной в секунду примерно, потом подвисать начинает приемник....буду думать..
0
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
18.06.2017, 06:42 18
Данные большого объёма могут приходить в несколько этапов. Нужно ориентироваться на k. Для TMemoryStream можно сразу установить размер, после получения k, и дальше добавлять данные через Write, пока не получено k байт.
0
1 / 1 / 2
Регистрация: 18.09.2016
Сообщений: 67
18.06.2017, 12:18  [ТС] 19
Я сначала заполняю массив размером k, а потом записываю в stream.
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   int k;
  char *Buffer;
  int len;
  int posi;
  int gh;
   while(1)
   {
   recv(client,reinterpret_cast<char *>(&k), sizeof(k),0);
   stream2->SetSize(k);
   stream2->Position=0;
   Buffer=new char[k];
   len=k;
   posi=0;
   while(len>0)
       {
       recv(client,&Buffer[posi],sizeof(Buffer),0);
       gh=sizeof(Buffer);
       len=len-gh;
       posi=posi+gh;
       }
      stream2->WriteBuffer(Buffer,k);
      stream2->Position=0;
      out_jpg->LoadFromStream(stream2);
     //out_jpg->SaveToFile("ko.jpg");
      PaintBox1->Canvas->Draw(0,0, out_jpg);
      stream2->Clear();
      stream2->Position=0;
      ZeroMemory(Buffer,k);
 }
примерно с секунду все красиво воспроизводит, а потом виснет. Наверное не успеваю обрабатывать пакеты и как следствие какой то пакет с информацией о картинке читается как её размер. Пробовал через Sleep на отправляющей стороне замедлить дело, но эффекта не дало. Думаю что надо несколько буферов делать....и через какую-нибудь callback функцию, но так не хочется - очень муторно, все ещё верю что можно проще все уладить.


Огромное спасибо nmcf за всю помощь, иногда закрадывается впечатление , что кроме вас тут никого нету.
0
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
18.06.2017, 13:14 20
Я уже объяснял в соседней теме, что sizeof не применим к указателю. Выделяешь память - эту величину и используй.
Количество полученных байт - это результат функции, который ты игнорируешь. И память надо освобождать в конце первого цикла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   int k;
  char *Buffer;
  int len;
  int posi;
  int gh;
   while(1)
   {
   recv(client,reinterpret_cast<char *>(&k), sizeof(k),0);
   stream2->SetSize(k);
   stream2->Position=0;
   Buffer=new char[k];
   posi=0;
 
   while (posi < k && (gh = recv(client, Buffer + posi, k - posi, 0)) > 0)
       posi += gh;
 
      stream2->WriteBuffer(Buffer,k);
      stream2->Position=0;
      out_jpg->LoadFromStream(stream2);
     //out_jpg->SaveToFile("ko.jpg");
      PaintBox1->Canvas->Draw(0,0, out_jpg);
      stream2->Clear();
      stream2->Position=0;
 
      delete[] Buffer;
 }
Так же может быть захват данных из следующей передачи, если они идут без достаточной паузы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2017, 13:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

BitMap Основные функции + работа в Bitmap
Я наткнулся на пару проблем не известных для меня. 1. Как поставить &quot;Настройки компонента&quot;...

Преобразование строки в bitmap
сабж, как можно преобразовать строку?

Преобразование BitMap в JPEG
Сижу уже второй день нон-стопом за курсовиком, не могу понять в чем идет собственно косяк. ...

Преобразование bitmap в image
Гугл полон обратными преобразованиями, а вот с этим что то туго.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.