Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 7. Jan 2014, 06:55
Zitat:
AtmoLockTransferBuffer um den Pointer auf den Buffer zu holen
Nö sperrt den Transfer des Buffer (Lock)

Zitat:
Bei dir erzeugst du jedes mal den Buffer neu. Aber warum sollte das bei Verwendung von COM notwendig sein?
Weil das Bild sich jede MS ändert.
Ich habe es auch versucht mit einem Flag welches prüft ob die Funktion schon aufgerufen wurde.
Das Ergebnis war das die Anwendung einen AV gemeldet hat.
Daher gehe ich erstmal davon aus das es so sein muss.

AtmoCreateTransferBuffers
Wird der Header der Bitmap erstellt also vorbereitet zum senden.

Danach werden die Pixel gesendet mit AtmoSendPixelData.

Ich kann mir das aber nochmal genau anschauen ob ich dahingehend noch was ändern kann / muss.

Delphi-Quellcode:
// *********************************************************************//
// richtet den Pixeltransferbuffer für den LiveSource Modus mit externer Quelle ein.
// FourCC enthält dabei den Code wie die Pixeldatei aufgebaut sind - derzeit sind
// folgende Codes in AtmoWinA.exe implementiert - andere Codes werden einfach ignoriert.

// FourCC = "HSVI" steht für ein Bild was bereits in HSV Daten vorliegt...
// oder man übergibt die in Windows.h? definierte Konstante "BI_RGB" was
// signalisiert dass es sich um unkomprimierte Pixeldaten handelt.

// bytePerPixel = legt fest wieviel Byte ein Pixel benötigt
// für HSVI wird der Wert 3 erwartet.
// für BI_RGB sind die Werte 2, 3 oder 4 zulässig.
// für 2 ist RGB 565 definiert!
// width = Breite des Bildauszugs derzeit ist nur 64 zulässig!
// height = Höhe des Bildauszugs derzeit ist nur 48 zulässig!
// *********************************************************************//
procedure TAtmoCtrlLib.AtmoCreateTransferBuffers(FourCC, bytePerPixel, width,
  height: Integer);

begin

  if Assigned(PbitmapInfoArr) then
  begin
    SafeArrayDestroy(PbitmapInfoArr);
    PbitmapInfoArr := nil;
  end;

  PbitmapInfoArr := SafeArrayCreateVector(VT_UI1, 0, sizeof(BITMAPINFOHEADER));

  SafeArrayAccessData(PbitmapInfoArr, Pointer(pheader));
  pheader.biSize := sizeof(BITMAPINFOHEADER);
  pheader.biWidth := width;
  pheader.biHeight := height;
  pheader.biBitCount := bytePerPixel * 8;
  pheader.biCompression := FourCC;
  SafeArrayUnaccessData(PbitmapInfoArr);
end;
Danke für die Infos.

PS:
Da bin ich auch noch nicht hinter gestiegen was damit gemeint ist.
Zitat:
für BI_RGB sind die Werte 2, 3 oder 4 zulässig.
Was für einen Wert 2,3 oder 4 bei mir ist BI_RGB = 0 welche Werte sollte man dann da noch addieren.
Na ok! Ich denke die meinen damit die Anzahl der Bytes wie bei 24 Bit Bitmaps = 4 Byte
32 Bit Bitmaps werden dann ignoriert weil mehr als 4 Bytes
Etwas undurchsichtig


gruss

Geändert von EWeiss ( 7. Jan 2014 um 07:12 Uhr)
  Mit Zitat antworten Zitat