|
Размер снапшота
|
|||
---|---|---|---|
#18+
Есть софтина (не моя) в ней кусок про создание формы и получения снимка с камеры. Сама PROCEDURE GetFrame THIS.msg(WM_CAP_GRAB_FRAME, 0,0) дает картинку по размеру окна. Вопрос как её сохранить или же как сделать снимок заданного разрешения (320 на 400) PARAMETERS idpers,typephoto LOCAL oForm IF typephoto=[p] fpref="P"+RIGHT(ALLTRIM(idpers),10) ELSE fpref="S"+RIGHT(ALLTRIM(idpers),10) ENDIF loFSO = CREATEOBJECT('Scripting.FileSystemObject') IF loFSO.FolderExists('PHOTO')= .F. MKDIR PHOTO ENDIF fcapname=CURDIR()+"\PHOTO\"+fpref+".bmp" fcapnameJ=CURDIR()+"\PHOTO\"+fpref+".jpg" oForm = CREATEOBJECT("Tform") oForm.Show(1) * end of main DEFINE CLASS Tform As Form #DEFINE WM_CAP_START 0x0400 #DEFINE WM_CAP_DRIVER_CONNECT (WM_CAP_START+10) #DEFINE WM_CAP_DRIVER_DISCONNECT (WM_CAP_START+11) #DEFINE WM_CAP_DRIVER_GET_CAPS (WM_CAP_START+14) #DEFINE WM_CAP_SET_PREVIEW (WM_CAP_START+50) #DEFINE WM_CAP_SET_OVERLAY (WM_CAP_START+51) #DEFINE WM_CAP_SET_PREVIEWRATE (WM_CAP_START+52) #DEFINE WM_CAP_GET_STATUS (WM_CAP_START+54) #DEFINE WM_CAP_GRAB_FRAME (WM_CAP_START+60) #DEFINE WM_CAP_SAVEDIB (WM_CAP_START+25) Width=320 && Ширина окна Height=440 && Высота окна Autocenter=.T. Caption="Фотографирование" MinButton=.F. MaxButton=.F. hWindow=0 hCapture=0 capWidth=0 capHeight=0 capOverlay=0 ADD OBJECT cmdSaveFrame As CommandButton WITH Default=.T.,; Left=12, Top=410, Height=27, Width=100, Caption="Сделать снимок",; Enabled=.F. ADD OBJECT cmdPreview As CommandButton WITH Default=.T.,; Left=130, Top=410, Height=27, Width=100, Caption="Предпросмотр",; Enabled=.F. ADD OBJECT cmdClose As CommandButton WITH Cancel=.T.,; Left=250, Top=410, Height=27, Width=70, Caption="Закрыть" PROCEDURE Activate IF THIS.hWindow = 0 DECLARE INTEGER GetFocus IN user32 THIS.hWindow = GetFocus() THIS.CreateCaptureWindow THIS.DriverConnect ENDIF PROCEDURE Destroy THIS.ReleaseCaptureWindow PROCEDURE cmdClose.Click DELETE FILE &fcapname ThisForm.Release PROCEDURE cmdSaveFrame.Click ThisForm.SaveFrame PROCEDURE cmdPreview.Click ThisForm.StartPreview PROCEDURE GetFrame THIS.msg(WM_CAP_GRAB_FRAME, 0,0) PROCEDURE SaveFrame THIS.msg(WM_CAP_GRAB_FRAME, 0,0) THIS.msg(WM_CAP_SAVEDIB, 0,fcapname,1) LOCAL lcPath, loGP, llReturn SET CLASSLIB TO vfpgdiplus additive loGP = CREATEOBJECT("GdipImages") loGP.LoadFromFile(fcapname) *loGP.CopyFromClipboard() loGP.SaveToFile('&fcapnameJ') = MESSAGEBOX(IIF(llReturn,'OK','Сохранено ')) PROCEDURE CreateCaptureWindow #DEFINE WS_CHILD 0x40000000 #DEFINE WS_VISIBLE 0x10000000 DECLARE INTEGER capCreateCaptureWindow IN avicap32; STRING lpszWindowName, LONG dwStyle,; INTEGER x, INTEGER y,; INTEGER nWidth, INTEGER nHeight,; INTEGER hParent, INTEGER nID THIS.hCapture = capCreateCaptureWindow("Фото",; WS_CHILD+WS_VISIBLE,; 10,8,320,400, THIS.hWindow, 1) PROCEDURE DriverConnect THIS.msg(WM_CAP_DRIVER_CONNECT, 0,0) IF THIS.IsCaptureConnected() THIS.GetCaptureDimensions STORE .T. TO THIS.cmdPreview.Enabled,THIS.cmdSaveFrame.Enabled THIS.Caption = THIS.Caption + ": connected, " +; LTRIM(STR(THIS.capWidth)) + "x" +; LTRIM(STR(THIS.capHeight)) ELSE THIS.Caption = THIS.Caption + ": failed to connect" ENDIF PROCEDURE DriverDisconnect THIS.msg(WM_CAP_DRIVER_DISCONNECT, 0,0) PROCEDURE ReleaseCaptureWindow IF THIS.hCapture <> 0 THIS.DriverDisconnect DECLARE INTEGER DestroyWindow IN user32 INTEGER hWnd = DestroyWindow(THIS.hCapture) THIS.hCapture = 0 ENDIF PROCEDURE msg(msg, wParam, lParam, nMode) IF THIS.hCapture = 0 RETURN ENDIF IF VARTYPE(nMode) <> "N" Or nMode=0 DECLARE INTEGER SendMessage IN user32; INTEGER hWnd, INTEGER Msg,; INTEGER wParam, INTEGER lParam = SendMessage(THIS.hCapture, msg, wParam, lParam) ELSE DECLARE INTEGER SendMessage IN user32; INTEGER hWnd, INTEGER Msg,; INTEGER wParam, STRING @lParam = SendMessage(THIS.hCapture, msg, wParam, @lParam) ENDIF FUNCTION IsCaptureConnected * analyzing fCaptureInitialized member of the CAPDRIVERCAPS structure #DEFINE CAPDRIVERCAPS_SIZE 44 LOCAL cBuffer, nResult cBuffer = Repli(Chr(0),CAPDRIVERCAPS_SIZE) THIS.msg(WM_CAP_DRIVER_GET_CAPS, Len(cBuffer), @cBuffer, 1) THIS.capOverlay = buf2dword(SUBSTR(cBuffer,5,4)) nResult = Asc(SUBSTR(cBuffer, 21,1)) RETURN (nResult<>0) PROCEDURE GetCaptureDimensions * reading uiImageWidth and uiImageHeight members * of the CAPSTATUS structure #DEFINE CAPSTATUS_SIZE 76 LOCAL cBuffer cBuffer = Repli(Chr(0), CAPSTATUS_SIZE) THIS.msg(WM_CAP_GET_STATUS, Len(cBuffer), @cBuffer, 1) THIS.capWidth = buf2dword(SUBSTR(cBuffer,1,4)) THIS.capHeight = buf2dword(SUBSTR(cBuffer,5,4)) PROCEDURE StartPreview THIS.msg(WM_CAP_SET_PREVIEWRATE, 30,0) THIS.msg(WM_CAP_SET_PREVIEW, 1,0) IF THIS.capOverlay <> 0 THIS.msg(WM_CAP_SET_OVERLAY, 1,0) ENDIF PROCEDURE StopPreview THIS.msg(WM_CAP_SET_PREVIEW, 0,0) ENDDEFINE FUNCTION buf2dword(lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 04:16 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст., пока не знаю, как переформатировать в 320х400, но программа у меня работает, если заменить vfpgdiplus.vcx на _gdiplus.vcx из "C:\Program Files (x86)\Microsoft Visual FoxPro 9\Ffc\" . Показывает в "Предпросмотре" мою физию с видеокамеры в формате 640х480. Если распаковать исходник этого _gdiplus.vcx, то наверно можно докопаться хотя бы до сохранения снимка PHOTO\P1.bmp, полученного при запуске Main with '1', 'p'. Правда, в _gdiplus.vcx нет такого класса, как vfpgdiplus!GDIpImages, нужного для срабатывания кнопки "Сделать снимок", но это уже мелочи. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 09:44 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Тут по идее надо как-то забрать его с формы. Сам снимок выдергивается по THIS.msg(WM_CAP_GRAB_FRAME, 0,0), ну точнее кадр. А вот как его мона забрать с формы ? Он ведь на форму лепится или как-то так. Понять не могу вообщем =( Не хотелось бы лезть в дебри, меняя в корне все прям. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 12:33 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст., "забрать его с формы" ? - Это ты о чём? Если программа по кнопке "Сделать снимок" помещает снимок в PHOTO\P1.bmp, то зачем этот снимок "брать с формы"? Это непостижимо!!! Другое дело, что по команде подключения к видео-камере ты получаешь размер кадра "по умолчанию" видео-драйвера камеры. У меня Logitech HD Webcam C255 обеспечивает картинки 1280x720, но из твоей программы подключение даёт 640x480. Вот как этим управлять? Есть команда WM_CAP_GET_STATUS, сообщающая текущее разрешение. А вот команды "WM_CAP_SET_STATUS", чтоб поменять разрешение, я не нашёл. А если ты получил с камеры картинку PHOTO\P1.bmp в формате 640x480, то дальше без порчи качества ты можешь эту картинку только обрезать каким-нибудь граф=редактором по размеру 320x400. Кстати, Клепинин в "Visual FoxPto 9" показывает, как загрузить граф-файл с диска в одном формате и записать его на диск в другом формате. Но аналогичная возможность есть и в _gdiplus.vcx SET CLASSLIB TO _gdiplus additive *!* loGP = CREATEOBJECT("GdipImages") *!* loGP.LoadFromFile(fcapname) *!* *loGP.CopyFromClipboard() *!* loGP.SaveToFile('&fcapnameJ') loGP = CREATEOBJECT("GpImage") loGP.CreateFromFile(fcapname,.T.) #DEFINE GDIPLUS_CHECK_OBJECT 1 #DEFINE GDIPLUS_CHECK_PARAMS 1 loGP.SaveToFile(m.fcapnameJ, 'image/jpeg', 'quality=80') ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 13:58 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Эврика! Чтоб задать нужный мне 320x240, а не умолчательно-оптимизированный размер снимка 640x480 надо после подключения к драйверу WM_CAP_DRIVER_CONNECT запросить WM_CAP_GET_VIDEOFORMAT, подправить в полученной структуре BITMAPINFO (BITMAPINFOHEADER) размеры снимка во втором и третьем словах и отправить эту структуру обратно по WM_CAP_SET_VIDEOFORMAT. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 17:13 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Маленькая поправка. Размеры снимка надо преустановить не после CONNECT, а прямо перед ним ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 17:40 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
авторСергей П.Ст., "забрать его с формы" ? - Это ты о чём? Если программа по кнопке "Сделать снимок" помещает снимок в PHOTO\P1.bmp, то зачем этот снимок "брать с формы"? Это непостижимо!!! THIS.msg(WM_CAP_GRAB_FRAME, 0,0) как раз по моему на форме его размещает.. нет разве ?... у меня в этом примере отображается на форме снимок. авторто дальше без порчи качества ты можешь эту картинку только обрезать каким-нибудь граф=редактором по размеру 320x400. А так как форма как раз нужного размера (320 на 400) точнее capCreateCaptureWindow нужного размера, то подумалось мне, что проще забрать как-то его оттуда. Он как раз получается обрезан как надо. авторно из твоей программы подключение даёт 640x480 А тут вообще на сколько я понял ограничение при использовании avicap будет в 640 на 480. Но сие не важно. Снижение на 320х240 это вообще не вариант.. потеря качество же просто будет. Тут нужно вырезать нужный фрагмент. З.Ы. перевод в джпег и сжатие это уже не вопрос.. с этим как раз и справляется vfpgdiplus. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2013, 01:00 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Блин, неужели никто не знает как получить картинку только размера THIS.hCapture = capCreateCaptureWindow("Фото",; WS_CHILD+WS_VISIBLE,; 10,8,320,400, THIS.hWindow, 1) ????????? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 02:10 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст., УЧИСЬ ЧИТАТЬ. Похоже, ты не умеешь читать не только технические руководства, но и ответы на твои вопросы. Тебе уже сказано здесь, чтоб получить вырезку 320x400 из файла с картинкой 640x480 надо использовать графический редактор. В драйвере AviCap32.dll такой команды нет. ИЩИ ФИЗИЧЕСКУЮ СУТЬ. В данном случае, суть того, что ты видишь на экране в том, что драйвер видеокамеры обеспечивает: 1) некоторый набор вариантов размера картинки (640х420, 320х240...); 2) показ картинки в окне отсечения (Capture Window) одним из двух способов - либо в натуральном размере, с отсечением того, что не влазит, а также с прокруткой в окне по дополнительным командам, либо с масштабированием (сжатием-растяжением по окну отсечения). Если ты это поймёшь, то ты поймёшь заодно, что операция показа картинки на экране через окно отсечения никак не связана с операцией сохранения картинки в файл на диске. И тогда, наконец, сможешь поставить вопрос правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 08:58 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Правильный вопрос, наверно, такой. Как получить доступ к графическому контексту для клиентской области фоксовской формы и как создать из этой области графический файл? Что-то похожее мне сейчас попалось у Клепинина в "Visual Foxpro 9" oWnd = CREATEOBJECT ('GdipWindow', ObjForm) hndl = oWnd.GetGraphics() Но тут надо дальше разбираться ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 11:26 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Эх, Сергей! Вот я наконец раздобыл CD-блин от книги Клепинина. У него там есть библиотека VfpGdiPlus.vcx, как у тебя в твоём тексте. А в библиотеке есть класс GdipImages, опять-таки как в твоём тексте. И чтоб сделать вырезку из изображения, загруженного из файла, надо в твоём тексте просто вместо loGP.SaveToFile (..) написать loGP.ClipImage (0, 0, THIS.Width,THIS.Height, m.fcapnameJ). Стоило ли тебе ломиться в открытую дверь? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 12:25 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
авторто ты поймёшь заодно, что операция показа картинки на экране через окно отсечения никак не связана с операцией сохранения картинки в файл на диске Интересно было бы увидеть сие утверждение от меня. Но чувствую не тот случай. То что сейчас там стоит сохранение, означает только лишь то, что я всего лишь сохраняю кадр. Вопрос был про область захвата, которое отображено на форме. авторПравильный вопрос, наверно, такой. Как получить доступ к графическому контексту для клиентской области фоксовской формы и как создать из этой области графический файл? Вы...вы... вы молодец просто. Я даже близко не подошел к этой формулировке. Даже намека не было. авторточнее capCreateCaptureWindow нужного размера, то подумалось мне, что проще забрать как-то его оттуда. Он как раз получается обрезан как надо. А на это не обращайте внимание. авторPROCEDURE GetFrame THIS.msg(WM_CAP_GRAB_FRAME, 0,0) дает картинку по размеру окна. Вопрос как её сохранить или ... И на это то же. авторИ чтоб сделать вырезку из изображения, загруженного из файла Хреновая идея. Резать изображение автоматом придется, а резать то, что за ранее не известно и тупо в заданной области - хреновая идея. Суть обрезки и выдергивании окна захвата, как раз в том, что оператор ВИДИТ что он фотографирует и именно эта область и сохранится. авторСтоило ли тебе ломиться в открытую дверь? И птицы устремились к вершине Фудзиямы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 06:15 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст.Хреновая идея. Резать изображение автоматом придется, а резать то, что за ранее не известно и тупо в заданной области - хреновая идея. Суть обрезки и выдергивании окна захвата, как раз в том, что оператор ВИДИТ что он фотографирует и именно эта область и сохранится. На хреново заданный вопрос обычно получают хреновый ответ. Прошло всего три дня и выяснилось что надо вырезать не просто кусок, а именно то что оператор видит. :) Если то что оператору картинку обрезанною выводит не может вернуть смещение (на сколько сдвинут кадр), то как вариант показать полную картинку (снимок 640*480) поверх него наложить прямоугольник прозрачный 320*400 и прописать DragDrop() чтобы оператор мышкой перетащил прямоугольник на нужную часть снимка. Дальше высчитать смещение. Как вырезать написали. Вариант два: сделать контейнер 320*400 а внутри него картинку 640*480 таскать. PS Ты бы пример рабочий сделал, форму с показом обрезанного, а там может кто запустит и подскажет чего. А то твой нерабочий код допиливать похоже никому не интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 11:01 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Dima T и Сергей. Или вы пишете здесь, не всё и не то, что думаете, или ... вы меня удивляете безмерно. Вы не заметили, что моё сообщение 14272861 от 08.05.13 12:25 полностью закрывает вопрос? Вставка loGP.ClipImage (0, 0, THIS.Width,THIS.Height, m.fcapnameJ) вместо loGP.SaveToFile (..) в метод SaveFrame на форме главной программы даёт как раз файл изображения с вырезкой по размеру окна формы (и окна отсечения). Сергей должен сказать "спасибо", а не блажить про "Фудзияму". А Дима, если б не поленился и запустил код из первого Сергеева вопроса, убедился б, что этот код вполне работоспособен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 11:25 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Надо ещё добавить, что создать файл изображения из графического контекста клиентской области окна формы в принципе возможно. Но мне показалось проще другое решение. В фоксовский объект GdipImages из Клепиниской библиотеки VfpGdiPlus.vcx загрузить изображение из bmp-файла, созданного драйвером видеокамеры из библиотеки AviCap32.dll, и методом GdipImages.ClipImage() сохранить вырезку из изображения по размеру формы в jpg-файл. Отличие от решения в первоначальном Сергеевом коде именно в замене метода SaveToFile() на ClipImage() - одна строка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 11:47 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
авторСергей должен сказать "спасибо", а не блажить про "Фудзияму". Приношу извинения, действительно Спасибо. Но вот только еще поправка. Форма то у меня 320 на 440 (ибо на ней кнопки сделать фото), а надо строго 320 на 400. Как быть ? У самого THIS.hCapture = capCreateCaptureWindow нет возможности так же обратиться к высоте и ширине же ? А форму уменьшить низя... оператор должон кнопку видеть =( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 12:49 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст., ты можешь в 3-м и 4-м параметрах ClipImage (Left, Top, Width, Height, File) давать любые положительные значения, большие размеров окна отсечения. Это те размеры, что устанавливаются в методе формы CreateCaptureWindow() в строке с "THIS.hCapture = capCreateCaptureWindow("Фото"... Похоже, что драйвер видеокамеры помещает свой снимок в окно формы, совмещая их левые верхние углы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 13:49 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Ой! неправда моя: "любые положительные значения, большие размеров окна отсечения" Надо, не "большие", а "равные или меньшие" ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 13:52 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Нет, я совсем запутался. На самом деле, размеры клипа не должны превышать размеров изображения. Они сохраняются на форме в THIS.capWidth и THIS.capHeight. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 13:56 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
и отображаются в заголовке формы ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 14:05 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
А первые два это случайно не позиция начала точки выделения ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 14:29 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Сергей П.Ст., ClipImage (Left, Top, - верхний левый угол клипа в прямоугольнике изображения, выбранного из bmp-файла, сделанного драйвером камеры Width, Height, - размеры клипа, вырезаемого из изображения File) - куда помещается клип ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 14:40 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
Спасибо. Кстати есть еще вопрос почти в ту же область. Может кто знает, в vfpgdiplus можно как-то при сохранении, сделать картинку в 256 градации серого ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2013, 00:33 |
|
Размер снапшота
|
|||
---|---|---|---|
#18+
А все.. вопрос закрыт. Сделано. Долго правда конвертит.. сек 15, но потерпеть можно =) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2013, 03:36 |
|
|
start [/forum/topic.php?fid=41&fpage=42&tid=1583053]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 160ms |
0 / 0 |