![]() |
C++ Übersetzung nach Delphi
Hallo !
Ich habe hier eine Quellcodepassage die ich nicht so richtig nachvollziehen kann, was da passiert und wie ich diese in Delphi umsetzen kann. Ich hoffe mir kann hier jemand dabei helfen.... image ist ein array of byte. Quasi eine Repräsentation im Raw-Format. width und height sind eigenschaften der zukünftigen Bitmap.
Code:
Mit Createfile und FWrite wird die Date später geschrieben....
int CMainFrame::SaveBitmapFile(char * filename, unsigned char * image, DWORD width, DWORD height)
{ unsigned char *p; DWORD x, y; p = (unsigned char *)malloc(width * height * 3); if ( !p ) return 0; for( y=0; y< height; y++) { for( x=0; x<width; x++) { *(p + (3 * width * (height - y - 1)) + (3 * x) + 0) = *(image+ (4 * width * y) + (4 * x ) + 0 ); *(p + (3 * width * (height - y - 1)) + (3 * x) + 1) = *(image + (4 * width * y) + (4 * x ) + 1 ); *(p + (3 * width * (height - y - 1)) + (3 * x) + 2) = *(image + (4 * width * y) + (4 * x ) + 2 ); } } BITMAPFILEHEADER bitmapFileHeader = { 0x4D42, 0, 0, 0, 0}; BITMAPINFOHEADER bmpInfoHeader; DWORD dwResult; bmpInfoHeader.biSize = 40; bmpInfoHeader.biWidth = width; bmpInfoHeader.biHeight = height; bmpInfoHeader.biPlanes = 1; bmpInfoHeader.biBitCount = 24; bmpInfoHeader.biSizeImage = width * height * 3; bmpInfoHeader.biXPelsPerMeter = 2835; bmpInfoHeader.biYPelsPerMeter = 2835; // Init bitmap header bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bitmapFileHeader.bfSize = bitmapFileHeader.bfOffBits + bmpInfoHeader.biSizeImage; } Das ist erst einmal mein Ansatz :
Delphi-Quellcode:
viele Grüße!
function SaveBitmapFile(filename : PChar, image : PByte,width : DWord, height : dword): integer;
var p : array of byte; x,y : integer; begin setlength(p,(width * height * 3)); for y:= 0 to heigth-1 do begin for x:=0 to width-1 do begin // den Bereich verstehe ich nicht so ganz. end; end; .... end; |
Re: C++ Übersetzung nach Delphi
Du brauchst es ja auch nicht so kompliziert!
Du kannst ja mit den Arrays arbeiten:
Delphi-Quellcode:
Ich hoffe, das klappt so. Ganz sicher bin ich mir nämlich auch nicht, da ich nicht weiß, ob Delphi Zeiger und Arrays ähnlich handhabt wie C.
p[(3 * width * (height - y - 1)) + (3 * x) + 0] := image[(4 * width * y) + (4 * x ) + 0]
p[(3 * width * (height - y - 1)) + (3 * x) + 1] := image[(4 * width * y) + (4 * x ) + 1] p[(3 * width * (height - y - 1)) + (3 * x) + 2] := image[(4 * width * y) + (4 * x ) + 2] LG, Xong |
Re: C++ Übersetzung nach Delphi
wenn ich den quelltext so sehe würde ich sagen:
- TBitmap anlegen - mit TBitmap.Scanline einen Pointer auf den Bitmapspeicher holen - mit move die Daten direkt ins Bitmap kopieren |
Re: C++ Übersetzung nach Delphi
Hallo!
@Xong Das funktioniert so nicht, "Record oder Array notwendig". "Die Pointer und Ich". Wenn ich wenigstens wüsste, was mit den Zeilen bezweckt werden soll. Vielleicht noch ein Zusatz . Die Variable Image ist so zugewiesen.
Delphi-Quellcode:
Die aufrufende c-Funktion ist so definiert.
image= ( BYTE *)malloc(bufferlength );
Code:
bool ImageReq( HCAMERA ULONG,BYTE *image,DWORD bufferlength );
Argument HCAMERA Handle value of a camera in which an image is acquired BYTE *pBuf Pointer of the place where image data is stored DWORD bufferlength Image data buffer length
Delphi-Quellcode:
@SirThornberry
function ImageReq(HCAMERA : ULONG;image : PByte; bufferlength : DWord):bool;stdcall;
Danke für den Ansatz :
Delphi-Quellcode:
Irgendwo habe ich doch einen grundlegenden Denkfehler gemacht. Nur wo sprach Zeus?
function SaveBitmapFile(filename : PChar, image : PByte,width : DWord, height : dword): integer;
var p : array of byte; x,y : integer; bitm : TBitmap; row : PByteArray; begin bitm := TBitmap.Create; bitm.Width := Width; bitm.Height := Height; try for y:= 0 to heigth-1 do begin row := PByteArray(bitm.Scanline[y]); move(image,row,....); // Size? end; finally bitm.Free; end; .... end; samstägliche Grüße! |
Re: C++ Übersetzung nach Delphi
Mal in Theorie getippt:
Delphi-Quellcode:
function SaveBitmapFile(filename : PChar, image : PByte,width : DWord, height : dword): integer;
var p : array of byte; x,y : integer; bitm : TBitmap; lDest, lSource: PByte; begin lSource := Image; // damit wir Image nicht verändern bitm := TBitmap.Create; try bitm.PixelFormat := pf32bit; bitm.Width := Width; bitm.Height := Height; for y:= 0 to heigth-1 do begin lDest := bitm.Scanline[y]; Move(lSource^, lDest^, Width * 4); Inc(lSource, Width*4); end; finally bitm.Free; end; end; |
Re: C++ Übersetzung nach Delphi
Hallo Muetze1,
danke Dir für deinen Tipp! Ich hoffe ich habe die Antwort nun. Die Kamera schickt das Bild als DIB (Device Independent Bitmap). Beruht der Faktor 4,den du gesetzt hast auf die 32 Bit des Bitmaps, also ein DWORD, für die relative Farbintensität von R,G,B + Reserviertem Byte pro Pixel? viele Grüße! |
Re: C++ Übersetzung nach Delphi
Zitat:
|
Re: C++ Übersetzung nach Delphi
Klasse,danke nochmal! Wäre ich alleine nicht drauf gekommen.... :)
Falls noch jemand mit Device Independent Bitmaps arbeitet, dann lohnt sich der Blick auf folgende Seiten : ![]() und speziell ![]() viele Grüße! |
Re: C++ Übersetzung nach Delphi
Zitat:
|
Re: C++ Übersetzung nach Delphi
Die Frage hat sich erledigt...
Ist ja auch schon spät :) EDIT\trotzdem danke mkinzler viele Grüße! mkinzler |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz