procedure TDSPlayer.SetSaveImage(Value:
String);
var
BufferSize : Integer;
DIBImage :
Array of Byte;
pDIBImage : Pointer;
lWidth : Integer;
lHeight : Integer;
hRes : HRESULT;
bmphdr : BITMAPFILEHEADER;
bmpinfo : BITMAPINFOHEADER;
nWritten : DWORD;
fh : THandle;
begin
fh := 0;
pDIBImage :=
nil;
{
* Wenn ein Videostream vorhanden ist, das Bild holen.
}
if isVideo
then try
{
* HRESULT GetCurrentImage(
* [in, out] long *pBufferSize,
* [out] long *pDIBImage
* );
*
* Beim ersten Aufruf muss die Buffersize 0 und der Pointer nil sein, dann
* erhält man die erforderliche Buffersize.
}
pDIBImage :=
nil;
BufferSize := 0;
hRes := FBasicVideo.getCurrentImage(BufferSize, pDIBImage^);
if (hRes <> S_OK)
then raise Exception.Create(Format('
%s'#10#13'
Error Code: %s', [GetErrorString(hRes), IntToHex(hRes, 8)]));
{
* Es wird der Speicher bereitgestellt und der Aufruf erfolgt mit der rich-
* tigen Speichergröße sowie dem Zeiger auf den bereitgestellten Speicher.
}
setLength(DIBImage, BufferSize);
pDIBImage := @DIBImage[0];
FBasicVideo.GetCurrentImage(BufferSize, pDIBImage^);
{
* Bitmapgröße
}
FBasicVideo.get_VideoWidth(lWidth);
FBasicVideo.get_VideoHeight(lHeight);
{
* Speicher für Bitmapdateiheader und Bitmapinfoheader bereitstellen
}
FillChar(bmphdr, SizeOf(bmphdr), 0);
FillChar(bmpinfo, SizeOf(bmpinfo), 0);
{
* Den Bitmapdateiheader erstellen
}
bmphdr.bfType := $4D42;
bmphdr.bfSize := sizeof(bmphdr) + sizeof(bmpinfo) + BufferSize;
bmphdr.bfOffBits := sizeof(bmphdr) + sizeof(bmpinfo);
{
* Den Bitmapinfoheader erstellen
}
bmpinfo.biSize := sizeof(bmpinfo);
bmpinfo.biWidth := lwidth;
bmpinfo.biHeight := lheight;
bmpinfo.biPlanes := 1;
bmpinfo.biBitCount := 32;
{
* Dateierweiterung kontrollieren
}
if ExtractFileExt(LowerCase(Value)) <> '
.bmp'
then Value := ChangeFileExt(Value, '
.bmp');
{
* Die Datei schreiben
}
fh := CreateFile(PChar(Value), GENERIC_WRITE, 0,
nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if fh <> INVALID_HANDLE_VALUE
then begin
WriteFile(fh, bmphdr, sizeof(bmphdr), nWritten,
nil);
WriteFile(fh, bmpinfo, sizeof(bmpinfo), nWritten,
nil);
WriteFile(fh, pDIBImage^, BufferSize, nWritten,
nil);
end
else raise Exception.Create(GetLastError);
finally
CloseHandle(fh);
end;
end;