powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Размер снапшота
25 сообщений из 25, страница 1 из 1
Размер снапшота
    #38248449
Есть софтина (не моя) в ней кусок про создание формы и получения снимка с камеры.
Сама
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)
...
Рейтинг: 0 / 0
Размер снапшота
    #38248547
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст., пока не знаю, как переформатировать в 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, нужного для срабатывания кнопки "Сделать снимок", но это уже мелочи.
...
Рейтинг: 0 / 0
Размер снапшота
    #38248786
Тут по идее надо как-то забрать его с формы. Сам снимок выдергивается по THIS.msg(WM_CAP_GRAB_FRAME, 0,0), ну точнее кадр. А вот как его мона забрать с формы ? Он ведь на форму лепится или как-то так. Понять не могу вообщем =(
Не хотелось бы лезть в дебри, меняя в корне все прям.
...
Рейтинг: 0 / 0
Размер снапшота
    #38248936
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст., "забрать его с формы" ? - Это ты о чём?
Если программа по кнопке "Сделать снимок" помещает снимок в 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')
...
Рейтинг: 0 / 0
Размер снапшота
    #38249381
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эврика! Чтоб задать нужный мне 320x240, а не умолчательно-оптимизированный размер снимка 640x480 надо после подключения к драйверу WM_CAP_DRIVER_CONNECT запросить WM_CAP_GET_VIDEOFORMAT, подправить в полученной структуре BITMAPINFO (BITMAPINFOHEADER) размеры снимка во втором и третьем словах и отправить эту структуру обратно по WM_CAP_SET_VIDEOFORMAT.
...
Рейтинг: 0 / 0
Размер снапшота
    #38249418
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькая поправка. Размеры снимка надо преустановить не после CONNECT, а прямо перед ним
...
Рейтинг: 0 / 0
Размер снапшота
    #38249737
авторСергей П.Ст., "забрать его с формы" ? - Это ты о чём?
Если программа по кнопке "Сделать снимок" помещает снимок в PHOTO\P1.bmp, то зачем этот снимок "брать с формы"? Это непостижимо!!!

THIS.msg(WM_CAP_GRAB_FRAME, 0,0) как раз по моему на форме его размещает.. нет разве ?... у меня в этом примере отображается на форме снимок.

авторто дальше без порчи качества ты можешь эту картинку только обрезать каким-нибудь граф=редактором по размеру 320x400.
А так как форма как раз нужного размера (320 на 400) точнее capCreateCaptureWindow нужного размера, то подумалось мне, что проще забрать как-то его оттуда. Он как раз получается обрезан как надо.

авторно из твоей программы подключение даёт 640x480
А тут вообще на сколько я понял ограничение при использовании avicap будет в 640 на 480. Но сие не важно. Снижение на 320х240 это вообще не вариант.. потеря качество же просто будет. Тут нужно вырезать нужный фрагмент.

З.Ы. перевод в джпег и сжатие это уже не вопрос.. с этим как раз и справляется vfpgdiplus.
...
Рейтинг: 0 / 0
Размер снапшота
    #38251120
Блин, неужели никто не знает как получить картинку только размера
THIS.hCapture = capCreateCaptureWindow("Фото",;
WS_CHILD+WS_VISIBLE,;
10,8,320,400, THIS.hWindow, 1) ?????????
...
Рейтинг: 0 / 0
Размер снапшота
    #38251208
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст.,
УЧИСЬ ЧИТАТЬ. Похоже, ты не умеешь читать не только технические руководства, но и ответы на твои вопросы. Тебе уже сказано здесь, чтоб получить вырезку 320x400 из файла с картинкой 640x480 надо использовать графический редактор. В драйвере AviCap32.dll такой команды нет.
ИЩИ ФИЗИЧЕСКУЮ СУТЬ. В данном случае, суть того, что ты видишь на экране в том, что драйвер видеокамеры обеспечивает:
1) некоторый набор вариантов размера картинки (640х420, 320х240...);
2) показ картинки в окне отсечения (Capture Window) одним из двух способов - либо в натуральном размере, с отсечением того, что не влазит, а также с прокруткой в окне по дополнительным командам, либо с масштабированием (сжатием-растяжением по окну отсечения).
Если ты это поймёшь, то ты поймёшь заодно, что операция показа картинки на экране через окно отсечения никак не связана с операцией сохранения картинки в файл на диске. И тогда, наконец, сможешь поставить вопрос правильно.
...
Рейтинг: 0 / 0
Размер снапшота
    #38251453
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный вопрос, наверно, такой. Как получить доступ к графическому контексту для клиентской области фоксовской формы и как создать из этой области графический файл?
Что-то похожее мне сейчас попалось у Клепинина в "Visual Foxpro 9"
oWnd = CREATEOBJECT ('GdipWindow', ObjForm)
hndl = oWnd.GetGraphics()
Но тут надо дальше разбираться
...
Рейтинг: 0 / 0
Размер снапшота
    #38251575
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, Сергей!
Вот я наконец раздобыл CD-блин от книги Клепинина. У него там есть библиотека VfpGdiPlus.vcx, как у тебя в твоём тексте. А в библиотеке есть класс GdipImages, опять-таки как в твоём тексте. И чтоб сделать вырезку из изображения, загруженного из файла, надо в твоём тексте просто вместо loGP.SaveToFile (..) написать loGP.ClipImage (0, 0, THIS.Width,THIS.Height, m.fcapnameJ).
Стоило ли тебе ломиться в открытую дверь?
...
Рейтинг: 0 / 0
Размер снапшота
    #38252514
авторто ты поймёшь заодно, что операция показа картинки на экране через окно отсечения никак не связана с операцией сохранения картинки в файл на диске

Интересно было бы увидеть сие утверждение от меня. Но чувствую не тот случай. То что сейчас там стоит сохранение, означает только лишь то, что я всего лишь сохраняю кадр. Вопрос был про область захвата, которое отображено на форме.

авторПравильный вопрос, наверно, такой. Как получить доступ к графическому контексту для клиентской области фоксовской формы и как создать из этой области графический файл?

Вы...вы... вы молодец просто. Я даже близко не подошел к этой формулировке. Даже намека не было.


авторточнее capCreateCaptureWindow нужного размера, то подумалось мне, что проще забрать как-то его оттуда. Он как раз получается обрезан как надо. А на это не обращайте внимание.

авторPROCEDURE GetFrame
THIS.msg(WM_CAP_GRAB_FRAME, 0,0)
дает картинку по размеру окна.
Вопрос как её сохранить
или ...
И на это то же.

авторИ чтоб сделать вырезку из изображения, загруженного из файла
Хреновая идея. Резать изображение автоматом придется, а резать то, что за ранее не известно и тупо в заданной области - хреновая идея. Суть обрезки и выдергивании окна захвата, как раз в том, что оператор ВИДИТ что он фотографирует и именно эта область и сохранится.

авторСтоило ли тебе ломиться в открытую дверь?
И птицы устремились к вершине Фудзиямы.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252555
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст.Хреновая идея. Резать изображение автоматом придется, а резать то, что за ранее не известно и тупо в заданной области - хреновая идея. Суть обрезки и выдергивании окна захвата, как раз в том, что оператор ВИДИТ что он фотографирует и именно эта область и сохранится.
На хреново заданный вопрос обычно получают хреновый ответ. Прошло всего три дня и выяснилось что надо вырезать не просто кусок, а именно то что оператор видит. :)

Если то что оператору картинку обрезанною выводит не может вернуть смещение (на сколько сдвинут кадр), то как вариант показать полную картинку (снимок 640*480) поверх него наложить прямоугольник прозрачный 320*400 и прописать DragDrop() чтобы оператор мышкой перетащил прямоугольник на нужную часть снимка. Дальше высчитать смещение. Как вырезать написали.
Вариант два: сделать контейнер 320*400 а внутри него картинку 640*480 таскать.

PS Ты бы пример рабочий сделал, форму с показом обрезанного, а там может кто запустит и подскажет чего. А то твой нерабочий код допиливать похоже никому не интересно.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252563
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T и Сергей. Или вы пишете здесь, не всё и не то, что думаете, или ... вы меня удивляете безмерно.

Вы не заметили, что моё сообщение 14272861 от 08.05.13 12:25 полностью закрывает вопрос?
Вставка loGP.ClipImage (0, 0, THIS.Width,THIS.Height, m.fcapnameJ) вместо loGP.SaveToFile (..) в метод SaveFrame на форме главной программы даёт как раз файл изображения с вырезкой по размеру окна формы (и окна отсечения).
Сергей должен сказать "спасибо", а не блажить про "Фудзияму".

А Дима, если б не поленился и запустил код из первого Сергеева вопроса, убедился б, что этот код вполне работоспособен.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252566
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо ещё добавить, что создать файл изображения из графического контекста клиентской области окна формы в принципе возможно. Но мне показалось проще другое решение.
В фоксовский объект GdipImages из Клепиниской библиотеки VfpGdiPlus.vcx загрузить изображение из bmp-файла, созданного драйвером видеокамеры из библиотеки AviCap32.dll, и методом GdipImages.ClipImage() сохранить вырезку из изображения по размеру формы в jpg-файл.

Отличие от решения в первоначальном Сергеевом коде именно в замене метода SaveToFile() на ClipImage() - одна строка.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252590
авторСергей должен сказать "спасибо", а не блажить про "Фудзияму".

Приношу извинения, действительно Спасибо.

Но вот только еще поправка. Форма то у меня 320 на 440 (ибо на ней кнопки сделать фото), а надо строго 320 на 400. Как быть ?
У самого THIS.hCapture = capCreateCaptureWindow нет возможности так же обратиться к высоте и ширине же ? А форму уменьшить низя... оператор должон кнопку видеть =(
...
Рейтинг: 0 / 0
Размер снапшота
    #38252632
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст., ты можешь в 3-м и 4-м параметрах ClipImage (Left, Top, Width, Height, File) давать любые положительные значения, большие размеров окна отсечения. Это те размеры, что устанавливаются в методе формы CreateCaptureWindow() в строке с "THIS.hCapture = capCreateCaptureWindow("Фото"...
Похоже, что драйвер видеокамеры помещает свой снимок в окно формы, совмещая их левые верхние углы.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252633
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой! неправда моя: "любые положительные значения, большие размеров окна отсечения"
Надо, не "большие", а "равные или меньшие"
...
Рейтинг: 0 / 0
Размер снапшота
    #38252636
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я совсем запутался. На самом деле, размеры клипа не должны превышать размеров изображения. Они сохраняются на форме в THIS.capWidth и THIS.capHeight.
...
Рейтинг: 0 / 0
Размер снапшота
    #38252642
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и отображаются в заголовке формы
...
Рейтинг: 0 / 0
Размер снапшота
    #38252648
А первые два это случайно не позиция начала точки выделения ?
...
Рейтинг: 0 / 0
Размер снапшота
    #38252658
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст., ClipImage
(Left, Top, - верхний левый угол клипа в прямоугольнике изображения, выбранного из bmp-файла, сделанного драйвером камеры
Width, Height, - размеры клипа, вырезаемого из изображения
File) - куда помещается клип
...
Рейтинг: 0 / 0
Размер снапшота
    #38252964
Спасибо. Кстати есть еще вопрос почти в ту же область. Может кто знает, в vfpgdiplus можно как-то при сохранении, сделать картинку в 256 градации серого ?
...
Рейтинг: 0 / 0
Размер снапшота
    #38253499
А все.. вопрос закрыт. Сделано. Долго правда конвертит.. сек 15, но потерпеть можно =)
...
Рейтинг: 0 / 0
Размер снапшота
    #38253503
Следом еще вопрос. avicap который мы юзаем в этом примере имеет одно очень нехорошее ограничение, а именно 640 на 480 точек. Можно как-нить обойти сие ? (((
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Размер снапшота
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]