Перейти к содержимому
Compvision.ru
Dr.Hell

Как сохранить handle компонента в IplImage?

Recommended Posts

Здравствуйте!

Программа на Borland Builder. Есть hDC компонента, нужно его изображение скопировать в IplImage. То есть, необходима функция обратная APIDrawIpl. Понятно, что скорее всего нужно аналогично побитово скопировать Bitmap в ImageData (хотя, тоже не очень понятно, как это сделать). Но может быть, есть какой-то более быстрый и легкий путь в эту сторону?

Нашел вот эту тему:

http://www.compvision.ru/forum/index.php?showtopic=390

Но, честно говоря, не понял, какое решение в итоге рабочее.

Изменено пользователем Dr.Hell

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще полезная ссылка в тему:

http://wladm.narod.ru/Borland/graphicksborlandbmp.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо! =) Оказалось, все вообще элементарно! И, главное, работает просто молниеносно, что мне и было необходимо!

IplImage * TBitmapToIplImage(Graphics::TBitmap *src)

{

  int _h = src->Height;

  int _w = src->Width;


  if (!src || _w==0)

    return NULL;


  IplImage* dest = cvCreateImage(cvSize(_w,_h),IPL_DEPTH_8U,3);


  try

  {

    unsigned char *pLine;


    for(int y=0; y<_h; y++)

    {

      pLine = (unsigned char *)src->ScanLine[y];

      memcpy(dest->imageData+_w*3*y, pLine, _w*3);

    }

  }

  catch(...)

  {

    MessageBox(0,"Exception when get data ","Error", MB_OK );

  }


  return dest;

}


//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)

{

  Graphics::TBitmap* Bitmap = new Graphics::TBitmap;

  HDC DC=GetDC(0); // Делаем снимок экрана для примера, тут можно использовать любой DC

  try{

    Bitmap->Height=Screen->Height;

    Bitmap->Width=Screen->Width;

    Bitmap->PixelFormat=pf24bit; // Обязательно нужно перевести в 24 бита

    // Копируем DC в битмап

    BitBlt(Bitmap->Canvas->Handle, 0, 0, Screen->Width, Screen->Height,DC, 0, 0, SRCCOPY);

    IplImage* TestImage = TBitmapToIplImage(Bitmap);

    APIDrawIpl(0,0,TestImage,Form1->Handle);

  }

  __finally

  {

    delete Bitmap;

    ReleaseDC(0,DC);

  }

}

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×