Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.
Заранее спасибо!
P.S. Я, кстати, пытался делать через буфер обмена, но это очень не удобно и иногда изображение не проходит...
P.P.S. Если надо, то формат изображения: 720x576x24
15.04.08 13:31: Перенесено модератором из 'Прочее' — Хитрик Денис
Здравствуйте, Shart, Вы писали:
S>Вообщем надо передать изображение из Delphi (простой TBitmap) в C++ Builder 6, чтобы там его обработать. Причём надо делать это почти мгновенно, потому что изображение из Delphi берётся с камеры.
Что значит "передать из дельфи в билдер"?
— у тебя два модуля одной программы (т.е. exe и dll) написаны на разных языках
— две программы, запущенные одновременно
— вторая программа запускается по мере необходимости (так сказать, unix way)
— программы запускаются по очереди
И что значит "чтобы там обработать"
— первая сторона родила изображение (захватила с видеокамеры), вторая приняла с концами
— первая сторона родила, вторая обработала и вернула
S>P.S. Я, кстати, пытался делать через буфер обмена, но это очень не удобно и иногда изображение не проходит...
За это убивать надо! А если там пользователь что-то держал? Или наоборот, он туда что-то положил невовремя?
В пределах одной программы — проще всего передавать в том виде, как они хранятся.
Казалось бы, дельфи и билдер используют общую библиотеку — так, может, можно прямо TBitmap передавать? Если нельзя — то передавай HBITMAP.
Между одновременно запущенными программами — большие данные можно через общую память (memory mapped file).
Наверняка, захват производится в DIB, и ты его уже потом конвертируешь в DDB. Так вот, не конвертируй, а пиши в MMF.
Синхронизацию (и даже конвеер с небольшой очередью) наладить — дело наживное.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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. И ещё, вроде читал, что одна программа не может работать с объектами другой программы, т. к. у них разные адресные пространства...
S>Сейчас есть exe на Delphi и DLL на BCB. В самой программе можно получить только TBitmap. Но передать TBitmap не получится, т.к. передаётся только ссылка...а с ней ничего не могу сделать...
Что значит "передаётся ссылка"? Указатель, что ли? Не можешь передать указатель в С++ную функцию, вызывая её из дельфийской? Я в шоке.
S>Задача DLL — по исходной картинке выдать просто число. Что дальше будет с картинкой уже не важно.
S>P.S. И ещё, вроде читал, что одна программа не может работать с объектами другой программы, т. к. у них разные адресные пространства...
DLL находится в том же адресном пространстве.
А для взаимодействия через MMF — естественно, нужно туда класть сами данные (т.е. массив байтов DIB), а не объекты-обёртки (TBitmap и прочее).
Здравствуйте, 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-модудей нельзя, и значения в переменных отладчик не кажет. Как там в нонишних интегрированных средах, я не в курсе.
[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;
Адресное пространство у них одно,так как это один процесс, так что проблем нет.
Если тебе надо меду приложениями передавать данные то просто используй GlobalAlloc, GlobalLock и передавай handle
Если есть желание то можно через CreatePipe и потом в один конец писать с другого читать.
Или если уж совсем распределённая система то по сети передавай (Indy например)
Здравствуйте, Аноним, Вы писали:
А>Я так понимаю, у тебя 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,...), простота и наглядность