Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ Übersetzung nach Delphi (https://www.delphipraxis.net/108529-c-uebersetzung-nach-delphi.html)

Johnny_W 15. Feb 2008 14:05


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:
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;

}
Mit Createfile und FWrite wird die Date später geschrieben....

Das ist erst einmal mein Ansatz :

Delphi-Quellcode:
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;
viele Grüße!

Xong 15. Feb 2008 14:31

Re: C++ Übersetzung nach Delphi
 
Du brauchst es ja auch nicht so kompliziert!
Du kannst ja mit den Arrays arbeiten:
Delphi-Quellcode:
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]
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.

LG,
Xong

SirThornberry 15. Feb 2008 14:47

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

Johnny_W 16. Feb 2008 13:19

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:
image= ( BYTE *)malloc(bufferlength );
Die aufrufende c-Funktion ist so definiert.
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:
function ImageReq(HCAMERA : ULONG;image : PByte; bufferlength : DWord):bool;stdcall;
@SirThornberry

Danke für den Ansatz :

Delphi-Quellcode:
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;
Irgendwo habe ich doch einen grundlegenden Denkfehler gemacht. Nur wo sprach Zeus?

samstägliche Grüße!

Muetze1 16. Feb 2008 15:10

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;

Johnny_W 16. Feb 2008 17:48

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!

Muetze1 16. Feb 2008 19:24

Re: C++ Übersetzung nach Delphi
 
Zitat:

Zitat von Johnny_W
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?

Ja, genau. Der C Quellcode hat die 32 Bit RGBx Werte umgesetzt auf 24 Bit RGB Werte, also das 4. Byte weggeworfen. Aber das können wir uns hier sparen und direkt 32 Bit nutzen. Dann braucht man nur noch die reinen Zeilen kopieren. Vor allem ist es damit auch einfacher den Quellzeiger weiter zu verschieben, da es bei 32 Bit Farbtiefen kein Padding gibt in den DIBits.

Johnny_W 17. Feb 2008 14:10

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 :

An introduction to DIBs
und speziell

BITMAPINFOHEADER

viele Grüße!

DMW 17. Feb 2008 19:45

Re: C++ Übersetzung nach Delphi
 
Zitat:

Zitat von Johnny_W
Falls noch jemand mit Device Independent Bitmaps arbeitet, dann lohnt sich der Blick auf folgende Seiten :

Auch den Petzold kann ich in dieser Hinsicht sehr empfehlen. Auf DIBs geht er detailliert ein.

Johnny_W 18. Feb 2008 19:54

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 19:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz