Ich habe spaßeshalber mal eine andere Kamera angeschlossen (Prosilica GE2040 monochrom) und dabei ist mir etwas aufgefallen. Wenn das Bildformat der Kamera auf
Mono8 gestellt ist, dann erhalte ich plötzlich auch Daten im FrameBuffer (nach
PvCaptureWaitForFrameDone), der bisher immer nur mit 0 gefüllt blieb.
Stelle ich die Farbkamera (GC2450C) mit dem Prosilica Herstellertool von
Bayer8 ebenfalls auf 8bit monochrom (
Mono8) um, dann bekomme ich auch hier plötzlich Daten in meinen Buffer geschrieben (zumindest unterscheiden sich nach jetzigem Erkenntnisstand die Werte von 0). Das kann es zwar auf Dauer nicht sein, ich möchte ja auch gerne die Farben, aber es ist wenigstens mal wieder ein kleiner Fortschritt.
Bei beiden Varianten habe ich aber immer wieder den Fall, daß einige Frames ausfallen mit der Fehlermeldung, daß einige Daten fehlen (Error Code 16).
Ich habe mir inzwischen aus dem
MSDN Informationen zusammengesucht um aus einem Speicherbereich ein Bitmap zu erzeugen, welches ich erst einmal auf dem Bildschirm mit einer TImage Komponente darstellen wollte. Für Stream und Dateien gibt es ja genug Beispiele. Für diesen Fall sind die Samples aber eer schmal gestreut und erschienen nicht anwendbar/funktional.
Derzeit scheinen die Bilddaten allerdings trotzdem irgenwo hängen zu bleiben. Auch ist noch nicht klar, wie die Palette des Bildes korrekt auszuformulieren ist. Ich versuche derzeit (bislang ja nur Graustufen) eine Palette manuell einzubauen. Werden bmiColors einfach ignoriert, wenn entsprechende
RGB Werte vorliegen? Dies muss ja sicherlich anders im Header deklariert werden.
Oder gibt es hier evtl. noch andere Faktoren die ich bislang nicht gefunden habe?
Delphi-Quellcode:
Var aFrame : tPvFrame;
aFrameBuffer :
Array of Byte;
aBitMap : tBitmap;
aErrValue : tPvErr;
aString : PAnsiChar;
aValue : Cardinal;
bmpInfo : ^BITMAPINFO;
totalbytes : Cardinal;
aChar : Char;
dc : HDC;
hBmp : HBITMAP;
cp : PRGBQUAD;
j : Cardinal;
GetMem(bmpInfo, sizeof(bmpInfo.bmiHeader) + sizeof(RGBQUAD) * Trunc(Power (2, aFrame.BitDepth)));
bmpInfo^.bmiHeader.biSize := SizeOf (bmpInfo.bmiHeader);
bmpInfo^.bmiHeader.biWidth := aFrame.Width;
bmpInfo^.bmiHeader.biHeight := aFrame.Height;
bmpInfo^.bmiHeader.biPlanes := 1;
bmpInfo^.bmiHeader.biBitCount := aFrame.BitDepth;
bmpInfo^.bmiHeader.biCompression := BI_RGB;
bmpInfo^.bmiHeader.biSizeImage := 0;
bmpInfo^.bmiHeader.biXPelsPerMeter := 0;
bmpInfo^.bmiHeader.biYPelsPerMeter := 0;
bmpInfo^.bmiHeader.biClrUsed := 0;
bmpInfo^.bmiHeader.biClrImportant := 0;
for j := 0
to Trunc (Power (2, aFrame.BitDepth)) - 1
do
begin
bmpInfo^.bmiColors[j].rgbBlue := j;
bmpInfo^.bmiColors[j].rgbGreen := j;
bmpInfo^.bmiColors[j].rgbRed := j;
bmpInfo^.bmiColors[j].rgbReserved := 0;
end;
dc := CreateDC('
DISPLAY',
nil,
nil,
nil);
hBmp := CreateDIBSection(
dc, bmpInfo^, DIB_RGB_COLORS, aFrame.ImageBuffer, 0, 0);
// hBmp := CreateDIBitmap(dc, bmpInfo^, DIB_RGB_COLORS, aFrame.ImageBuffer, 0, 0);
DeleteDC(
dc);
FreeMem(bmpInfo, sizeof(bmpInfo.bmiHeader) + sizeof(RGBQUAD) * Trunc(Power (2, aFrame.BitDepth)));
aBitmap := TBitmap.Create;
aBitmap.Handle := hBmp;
Image1.Picture.Bitmap := aBitmap;
Ganz herzlichen Dank an alle, die Hilfe beigesteuert haben
Jan