На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Снять изображение с IDirectDrawSurface в CImage.
    ExpandedWrap disabled
      void CWeb_Camera_MFCDlg::OnBnClickedButtonCapture()
      {
          HRESULT hr;
       
          CComPtr<IDirectDrawVideo> pDirectDrawVideo;
          CComPtr<IDirectDraw> pDirectDraw;
          CComPtr<IDirectDrawSurface> pGDIDDSSurface;
       
       
          hr = pVideoRenderer->QueryInterface(IID_IDirectDrawVideo, (void **)&pDirectDrawVideo);
       
          if (SUCCEEDED(hr))
          {
              hr = pDirectDrawVideo->GetDirectDraw(&pDirectDraw);
              if (SUCCEEDED(hr))
              {
                  hr = pDirectDraw->GetGDISurface(&pGDIDDSSurface);
       
                  if (SUCCEEDED(hr))
                  {
                      HDC local_surface_dc;
                      hr = pGDIDDSSurface->GetDC(&local_surface_dc);
       
                      if (SUCCEEDED(hr))
                      {
                          {
                              HDC scrdc, memdc;
                              HBITMAP membit;
                              scrdc = local_surface_dc;
                              int Height = 600;
                              int Width = 800;
                              memdc = CreateCompatibleDC(scrdc);
                              membit = CreateCompatibleBitmap(scrdc, Width, Height);
                              HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
                              BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
       
                              CImage parameter_image;
       
                              parameter_image.Attach(membit);
                              parameter_image.Save(CString("c:\\temp\\CaptureWebCameraShot.jpg"));
       
       
                              SelectObject(memdc, hOldBitmap);
                              DeleteObject(memdc);
                              //      DeleteObject(membit);
                              ::ReleaseDC(0,scrdc);
                          }
       
                          hr = pGDIDDSSurface->ReleaseDC(local_surface_dc);
       
                          if (SUCCEEDED(hr))
                          {
                          }
                      }
                  }
              }  
          }
      }


    Получается фиолетовое изображение нужного размера и формата.
    Сообщение отредактировано: Kozlov_Sergey -
      Временно сделал так:
      отображаю поверхность в окно и делаю снимок окна.

      ExpandedWrap disabled
        void CaptureWndShot(HWND hwnd, CImage *parameter_image, int width=0, int height=0)
        {
            if(parameter_image==NULL)
            {
                return;
            }
         
            {
                HDC scrdc, memdc;
                HBITMAP membit;
                scrdc = ::GetDC(hwnd);
                RECT local_rect;
                ::GetWindowRect(hwnd, &local_rect);
                int Width = local_rect.right-local_rect.left;
                int Height = local_rect.bottom-local_rect.top;
         
                if(width!=0)
                {
                    Width = width;
                }
                if(height!=0)
                {
                    Height = height;
                }
                memdc = CreateCompatibleDC(scrdc);
                membit = CreateCompatibleBitmap(scrdc, Width, Height);
                HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
                BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
         
                //      parameter_image->Attach(membit);
                //      parameter_image->Save(CString("c:\\temp\\CaptureWndShot.png"));
         
                parameter_image->Attach(membit);
         
                SelectObject(memdc, hOldBitmap);
                DeleteObject(memdc);
                //      DeleteObject(membit);
                ::ReleaseDC(0,scrdc);
            }
        }


      ExpandedWrap disabled
        void CWeb_Camera_MFCDlg::OnBnClickedButtonCapture()
        {
            CImage local_image;
         
            CaptureWndShot(m_hWnd,&local_image, 800, 600);
         
            local_image.Save(CString("c:\\temp\\CaptureWndShot.png"));
        }


      Хотелось бы узнать способ с поверхностями.
        Я прочитал, что SRCCOPY не работает в оверлейными поверхностями.

        Как быть?
          Зачем эта помесь GDI и DX? Возьми биты изображения из LockRect, сохрани их в Bitmap
          const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
          for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


          user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
            Есть ещё такой код.
            Но SRCCOPY не работает с оверлейными поверхностями.

            ExpandedWrap disabled
              void CWeb_Camera_MFCDlg::make_capture()
              {
                  HRESULT hr;
               
                  CComPtr<IDirectDrawVideo> pDirectDrawVideo;
                  CComPtr<IDirectDraw> pDirectDraw;
                  CComPtr<IDirectDrawSurface> pGDIDDSSurface;
               
               
                  hr = pVideoRenderer->QueryInterface(IID_IDirectDrawVideo, (void **)&pDirectDrawVideo);
               
                  if (SUCCEEDED(hr))
                  {
                      hr = pDirectDrawVideo->GetDirectDraw(&pDirectDraw);
                      if (SUCCEEDED(hr))
                      {
                          hr = pDirectDraw->GetGDISurface(&pGDIDDSSurface);
               
                          if (SUCCEEDED(hr))
                          {
                              HDC local_surface_dc;
                              hr = pGDIDDSSurface->GetDC(&local_surface_dc);
               
                              if (SUCCEEDED(hr))
                              {
                                  {
                                      {
                                          HDC scrdc, memdc;
                                          HBITMAP membit;
                                          scrdc = local_surface_dc;
                                          int Width = 800;
                                          int Height = 600;
                                          memdc = CreateCompatibleDC(scrdc);
                                          membit = CreateCompatibleBitmap(scrdc, Width, Height);
                                          HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
                                          BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
               
                                          CImage parameter_image;
               
                                          parameter_image.Attach(membit);
                                          parameter_image.Save(CString("c:\\temp\\CaptureWebCameraShot.jpg"));
               
               
                                          SelectObject(memdc, hOldBitmap);
                                          DeleteObject(memdc);
                                          //      DeleteObject(membit);
                                          ::ReleaseDC(0,scrdc);
                                      }
                                  }
                              }
                          }
                      }  
                  }
              }


            Ты лучше по теме помоги.

            Добавлено
            Кстати это помесь не DirectX с GDI, а directdraw с GDI.

            Directdraw больше не часть DirectX.
            Сообщение отредактировано: Kozlov_Sergey -
              LockRect использовать затруднительно из-за большого количества возможных типов сжатия картинок в поверхности.

              То есть там не RGBA.
                Цитата Kozlov_Sergey @
                LockRect использовать затруднительно из-за большого количества возможных типов сжатия картинок в поверхности.

                YUY2, YV12/NV12? Код преобразования этих схем в RGBA есть в MSDN: https://msdn.microsoft.com/ru-ru/library/jj872764.aspx (TransformImage_xxx)
                const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
                for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


                user posted image Чат Исходников в СкайпеНе тормози, форум теперь здесь!Чат Исходников в Дискорде
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,1349 ]   [ 17 queries used ]   [ Generated: 7.12.19, 16:24 GMT ]