Изображение из Delphi в Builder
От: Shart  
Дата: 09.04.08 16:13
Оценка:
Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.

Заранее спасибо!

P.S. Я, кстати, пытался делать через буфер обмена, но это очень не удобно и иногда изображение не проходит...

P.P.S. Если надо, то формат изображения: 720x576x24

15.04.08 13:31: Перенесено модератором из 'Прочее' — Хитрик Денис
Re: Изображение из Delphi в Builder
От: Кодт Россия  
Дата: 10.04.08 12:28
Оценка:
Здравствуйте, Shart, Вы писали:

S>Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.


Что значит "передать из дельфи в билдер"?
— у тебя два модуля одной программы (т.е. exe и dll) написаны на разных языках
— две программы, запущенные одновременно
— вторая программа запускается по мере необходимости (так сказать, unix way)
— программы запускаются по очереди

И что значит "чтобы там обработать"
— первая сторона родила изображение (захватила с видеокамеры), вторая приняла с концами
— первая сторона родила, вторая обработала и вернула

S>P.S. Я, кстати, пытался делать через буфер обмена, но это очень не удобно и иногда изображение не проходит...


За это убивать надо! А если там пользователь что-то держал? Или наоборот, он туда что-то положил невовремя?



В пределах одной программы — проще всего передавать в том виде, как они хранятся.
Казалось бы, дельфи и билдер используют общую библиотеку — так, может, можно прямо TBitmap передавать? Если нельзя — то передавай HBITMAP.

Между одновременно запущенными программами — большие данные можно через общую память (memory mapped file).
Наверняка, захват производится в DIB, и ты его уже потом конвертируешь в DDB. Так вот, не конвертируй, а пиши в MMF.
Синхронизацию (и даже конвеер с небольшой очередью) наладить — дело наживное.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Изображение из Delphi в Builder
От: Shart  
Дата: 10.04.08 13:42
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Shart, Вы писали:


S>>Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.


К>Что значит "передать из дельфи в билдер"?

К>- у тебя два модуля одной программы (т.е. exe и dll) написаны на разных языках
К>- две программы, запущенные одновременно
К>- вторая программа запускается по мере необходимости (так сказать, unix way)
К>- программы запускаются по очереди

К>И что значит "чтобы там обработать"

К>- первая сторона родила изображение (захватила с видеокамеры), вторая приняла с концами
К>- первая сторона родила, вторая обработала и вернула

S>>P.S. Я, кстати, пытался делать через буфер обмена, но это очень не удобно и иногда изображение не проходит...


К>За это убивать надо! А если там пользователь что-то держал? Или наоборот, он туда что-то положил невовремя?


К>

К>В пределах одной программы — проще всего передавать в том виде, как они хранятся.
К>Казалось бы, дельфи и билдер используют общую библиотеку — так, может, можно прямо TBitmap передавать? Если нельзя — то передавай HBITMAP.

К>Между одновременно запущенными программами — большие данные можно через общую память (memory mapped file).

К>Наверняка, захват производится в DIB, и ты его уже потом конвертируешь в DDB. Так вот, не конвертируй, а пиши в MMF.
К>Синхронизацию (и даже конвеер с небольшой очередью) наладить — дело наживное.

Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...
Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.

P.S. И ещё, вроде читал, что одна программа не может работать с объектами другой программы, т. к. у них разные адресные пространства...
Re[3]: Изображение из Delphi в Builder
От: Кодт Россия  
Дата: 10.04.08 15:23
Оценка:
S>Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...

Что значит "передаётся ссылка"? Указатель, что ли? Не можешь передать указатель в С++ную функцию, вызывая её из дельфийской? Я в шоке.

S>Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.


S>P.S. И ещё, вроде читал, что одна программа не может работать с объектами другой программы, т. к. у них разные адресные пространства...


DLL находится в том же адресном пространстве.
А для взаимодействия через MMF — естественно, нужно туда класть сами данные (т.е. массив байтов DIB), а не объекты-обёртки (TBitmap и прочее).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Изображение из Delphi в Builder
От: Tonal- Россия www.promsoft.ru
Дата: 12.04.08 05:47
Оценка:
Здравствуйте, Shart, Вы писали:
S>>>Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.
К>>В пределах одной программы — проще всего передавать в том виде, как они хранятся.
К>>Казалось бы, дельфи и билдер используют общую библиотеку — так, может, можно прямо TBitmap передавать? Если нельзя — то передавай HBITMAP.
S>Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...
S>Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.
Delphi какой версии?
Обмениваться объектами напрямую между Delphi и BCB кодом можно только если версии совпадают и стоят одинаковые сервиспаки.
Т.е. без проблем только в после BDS2006.
Кроме того, если используются dll-ки, то и прогга и dll-ки должны быть собраны с динамическим рантаймом и пакетами.

В твоём случае, проще всего передать в dll-ку HBITMAP (TBitmap.handle) а в ей по этому HBITMAP или напрямую через WinApi работать, либо завернуть опять же в TBitmap — установив TBitmap.handle.

P.S. Есть ещё вариант совмещения Delphi и BCB — в проект на BCB просто добавляешь исходники на делфи (*.pas & *.dfm) и всё это собирается в один модуль (exe или dll). Но тут есть свои ограничения — для BCB <=6 редактировать формы для pas-модудей нельзя, и значения в переменных отладчик не кажет. Как там в нонишних интегрированных средах, я не в курсе.
... << RSDN@Home 1.2.0 alpha 4 rev. 1065>>
Re[3]: Изображение из Delphi в Builder
От: Danchik Украина  
Дата: 15.04.08 09:55
Оценка:
Здравствуйте, Shart, Вы писали:

[Skip]

S>Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...

S>Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.

Если все происходит в одном процессе, то все делается очень просто:

var
  bmpSource : TBitmap;
begin
  bmpSource := TBitmap.Create;
  try 
    ... // захват в bmpSource
    Somemethod(bmpSource.ReleaseHandle);
  finally  
    bmpSource.Free;
  end;
end;

procedure Somemethod(bmp : HBITMAP);
var
  bmpSource : TBitmap;
begin
  bmpSource := TBitmap.Create;
  try 
    bmpSource.Handle := bmp;
    // все обменялись хендлами
    ... // работаем
  finally  
    bmpSource.Free;
  end;
end;


S>P.S. И ещё, вроде читал, что одна программа не может работать с объектами другой программы, т. к. у них разные адресные пространства...

Тебя четко спросили, производиш ли ты межроцессный обмен (два процеса обиениваются данными) или ты из EXE дергаеш функцию своей DLL. Для межпроцессорного обмена используй, например mapped file — оберток этого добра написано немеряно.
Re[3]: Изображение из Delphi в Builder
От: Аноним  
Дата: 18.04.08 11:31
Оценка:
Здравствуйте, Shart, Вы писали:

S>>>Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.

...
S>Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...
S>Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.

Я так понимаю, у тебя Delphi вызывает dll-ку которая собрана билдером. И тебе надо картинку проанализировать
Не заморачивайся пиши примерно так:
type
  TRawImage=record
    data:pchar;
    w,h,bpl:integer;
  end;
function _recognize_image(var img:TRawImage):integer;stdcall;external 'my_ocr.dll' name '_recognize_image';
function recognize_image(bmp:TBitmap):integer;
var img:TRawImage;
begin
  bmp.PixelFormat:=pf32bit;
  img.data:=bmp.ScanLine[0];
  img.w:=bmp.Width; img.h:=bmp.Height;
  if img.h<2 then img.bpl:=0 else img.bpl:=pchar(bmp.Scanline[1])-img.data;
  result:=_recognize_image(img);
end;


...
struct TRawImage {
  char* data;
  int w,h,bpl;
  int* getScanline(int y) const { return data+y*bpl; }
};
...
extern "C" int __stdcall recognize_image(TRawImage* img) {
  int sum=0;
  for(int y=0;y<img->h;y++) {
    int* q=img->getScanline(y);
    for(int x=0;x<img->w;x++) {
      sum+=rgb24_to_gray(q[x]); 
    }
  }
  int area=img->w*img->h;
  if (area) sum/=area;
  return sum>threshold?-1:+1; 
}
...

Адресное пространство у них одно,так как это один процесс, так что проблем нет.

Если тебе надо меду приложениями передавать данные то просто используй GlobalAlloc, GlobalLock и передавай handle
Если есть желание то можно через CreatePipe и потом в один конец писать с другого читать.
Или если уж совсем распределённая система то по сети передавай (Indy например)
Re[4]: Изображение из Delphi в Builder
От: Danchik Украина  
Дата: 18.04.08 12:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я так понимаю, у тебя Delphi вызывает dll-ку которая собрана билдером. И тебе надо картинку проанализировать

А>Не заморачивайся пиши примерно так:
[Skip]
А>Адресное пространство у них одно,так как это один процесс, так что проблем нет.

Хехе, а кто же тогда мешает просто обменятся хендлами?

А>Если тебе надо меду приложениями передавать данные то просто используй GlobalAlloc, GlobalLock и передавай handle

А>Если есть желание то можно через CreatePipe и потом в один конец писать с другого читать.
А>Или если уж совсем распределённая система то по сети передавай (Indy например)

Согласен
Re[5]: Изображение из Delphi в Builder
От: Аноним  
Дата: 18.04.08 12:52
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Хехе, а кто же тогда мешает просто обменятся хендлами?

А нафига, если всё равно нужно обрабатывать(анализировать) изображение.
Так что это самый быстрый вариант. И формат данных rgb32 как самый оптимальный во всех отношениях:
Cкорость(выравнивание sizeof(register)), гибкость (bw,gray8,gray16,gray32,rgb24,rgb32,flt32,...), простота и наглядность
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.