У меня на форме есть компонент Image. КАк сохранять в файл bmp
if SaveDialog1.Execute then
SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar(SaveDialog1.FileName)));
где WM_CAP_SAVEDIB=WM_CAP_START+25
а как сохранить фото сразу в этот компонент без временного сохранения в файл.
все разобрался
if (hWndC <> 0) and (SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0) = 1) and
(SendMessage(hWndC, WM_CAP_EDIT_COPY, 0, 0) = 1) and (Clipboard.HasFormat(CF_BITMAP)) then
begin
// bmp.
bmp:=TBitmap.Create;
BMP.Assign(Clipboard);
Image1.Picture.Assign(bmp);
end;
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
typedef struct videohdr_tag {
LPBYTE lpData;
DWORD dwBufferLength;
DWORD dwBytesUsed;
DWORD dwTimeCaptured;
DWORD_PTR dwUser;
DWORD dwFlags;
DWORD_PTR dwReserved[4];
} VIDEOHDR, *PVIDEOHDR, *LPVIDEOHDR;
A BYTE is an 8-bit unsigned value that corresponds to a single octet in a network protocol.
This type is declared as follows:
typedef unsigned char BYTE, *PBYTE, *LPBYTE;
Private Structure VIDEOHDR
Dim lpData As Integer '// address of video buffer
Dim dwBufferLength As Integer '// size, in bytes, of the Data buffer
Dim dwBytesUsed As Integer '// see below
Dim dwTimeCaptured As Integer '// see below
Dim dwUser As Integer '// user-specific data
Dim dwFlags As Integer '// see below
<VBFixedArray(3)> Dim dwReserved() As Integer '
End Structure
формально - LPBYTE = "дальний" (far) указатель на BYTE, PBYTE - "ближний" (near) указатель на BYTE, практически, с учётом модели памяти в Windows (flat) разницы никакой.
Dim lpData As Integer '// address of video buffer
Dim dwBufferLength As Integer '// size, in bytes, of the Data buffer
Debugger писал(а):адрес занимает 48 бит
Debugger писал(а):Впрочем, не важно. Получить байты получилось. Callback-функция вызывается с заполненной структурой, всё хорошо. Но при разрешении камеры 640 на 480 поле dwBytesUsed равно 614400. Получается 614400/(640*480)
Debugger писал(а):2 байта на пиксель?
Бред. Адресация равна разрядности системы
© с какого-то манулаПрыжок считается ближним, если адрес, на который делается прыжок, находится не дальше чем 128 байт назад и 127 байт вперёд от следующей команды. Дальний прыжок это прыжок дальше, чем на [-128,127] байт.
Debugger писал(а):2 байта на пиксель. Как там кодируются каналы R, G и B - неизвестно
The bitmap has a maximum of 2^16 colors. If the biCompression member of the BITMAPINFOHEADER is BI_RGB, the bmiColors member of BITMAPINFO is NULL. Each WORD in the bitmap array represents a single pixel. The relative intensities of red, green, and blue are represented with five bits for each color component. The value for blue is in the least significant five bits, followed by five bits each for green and red. The most significant bit is not used. The bmiColors color table is used for optimizing colors used on palette-based devices, and must contain the number of entries specified by the biClrUsed member of the BITMAPINFOHEADER.
If the biCompression member of the BITMAPINFOHEADER is BI_BITFIELDS, the bmiColors member contains three DWORD color masks that specify the red, green, and blue components, respectively, of each pixel. Each WORD in the bitmap array represents a single pixel.
When the biCompression member is BI_BITFIELDS, bits set in each DWORD mask must be contiguous and should not overlap the bits of another mask. All the bits in the pixel do not have to be used.
16 — если поле biCompression содержит значение BI_RGB, файл не содержит палитры. Каждые два байта изображения хранят интенсивность красной, зелёной и синей компоненты одного пиксела. При этом старший бит не используется, на каждую компоненту отведено 5 бит: 0RRRRRGGGGGBBBBB.
Если поле biCompression содержит значение BI_BITFIELDS, палитра хранит три четырёхбайтовых значения, определяющих маску для каждой из трёх компонент цвета. Каждый пиксел изображения представлен двухбайтным значением, из которого с помощью масок извлекаются цветовые компоненты. Для WinNT/2000/XP — последовательности бит каждой компоненты должны следовать непрерывно, не перекрываясь и не пересекаясь с последовательностями других компонент. Для Win95/98/Me — поддерживаются только следующие маски: 5-5-5, где маска синей компоненты 0х001F, зелёной 0x03E0, красной 0x7C00; и 5-6-5, где маска синей компоненты 0x001F, зелёной 0x07E0, красной 0xF800.
довольно долго созерцал biCompression=844715353
http://fourcc.org/yuv.php#YUY2 (как я понял, тут на два пикселя общие коэффициенты U и V, да?)
msdn писал(а):In YUY2 format, the data can be treated as an array of unsigned char values, where the first byte contains the first Y sample, the second byte contains the first U (Cb) sample, the third byte contains the second Y sample, and the fourth byte contains the first V (Cr) sample
Debugger писал(а):как я понял, тут на два пикселя общие коэффициенты U и V, да?
y0 = (unsigned char) YUV[i + 0];
u = (unsigned char) YUV[i + 1] - 128;
y1 = (unsigned char) YUV[i + 2];
v = (unsigned char) YUV[i + 3] - 128;
Public VIDEOINFO As BITMAPINFO
Public VIDEOBUFF() As RGBQUAD
Dim FrameBytes() As Byte
Dim BufInit As Boolean
Private Function Clamp(tmp As Integer) As Byte
If tmp < 0 Then tmp = 0
If tmp > 255 Then tmp = 255
Clamp = tmp
End Function
Function YUV2RGB(ByVal y As Single, ByVal U As Single, ByVal V As Single) As RGBQUAD
YUV2RGB.rgbBlue = Clamp(1.164 * (y - 16) + 2.018 * (U - 128))
YUV2RGB.rgbGreen = Clamp(1.164 * (y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128))
YUV2RGB.rgbRed = Clamp(1.164 * (y - 16) + 1.596 * (V - 128))
End Function
Function FrameCallback(ByVal hwnd As Long, ByRef struc As VIDEOHDR) As Long
Dim b() As Byte, x As Integer, y As Integer, c As Long
If Not BufInit Then
ReDim FrameBytes(struc.dwBytesUsed)
BufInit = True
End If
CopyMemory FrameBytes(0), ByVal struc.lpData, struc.dwBytesUsed
For x = 0 To VIDEOINFO.bmiHeader.biWidth - 1 Step 2
For y = 0 To VIDEOINFO.bmiHeader.biHeight - 1
c = y * VIDEOINFO.bmiHeader.biWidth + x
c = c * 2
VIDEOBUFF(x, y) = YUV2RGB(FrameBytes(c), FrameBytes(c + 1), FrameBytes(c + 3))
VIDEOBUFF(x + 1, y) = YUV2RGB(FrameBytes(c + 2), FrameBytes(c + 1), FrameBytes(c + 3))
'Проверка (чисто тест)
SetPixel Form1.pct.hdc, x, y, RGB(VIDEOBUFF(x, y).rgbRed, VIDEOBUFF(x, y).rgbRed, VIDEOBUFF(x, y).rgbRed)
SetPixel Form1.pct.hdc, x + 1, y, RGB(VIDEOBUFF(x + 1, y).rgbRed, VIDEOBUFF(x + 1, y).rgbRed, VIDEOBUFF(x + 1, y).rgbRed)
Next
Next
DoEvents
End Function
Mihail_ писал(а):обычно это даже самые дешевые веб камеры и платы видеозахвата по 10$ позволяют сделать
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11