AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ Übersetzung nach Delphi

Ein Thema von Johnny_W · begonnen am 15. Feb 2008 · letzter Beitrag vom 18. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Johnny_W

Registriert seit: 27. Apr 2005
33 Beiträge
 
Delphi 2005 Personal
 
#1

C++ Übersetzung nach Delphi

  Alt 15. Feb 2008, 14:05
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!
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#2

Re: C++ Übersetzung nach Delphi

  Alt 15. Feb 2008, 14:31
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: C++ Übersetzung nach Delphi

  Alt 15. Feb 2008, 14:47
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Johnny_W

Registriert seit: 27. Apr 2005
33 Beiträge
 
Delphi 2005 Personal
 
#4

Re: C++ Übersetzung nach Delphi

  Alt 16. Feb 2008, 13:19
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.
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
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!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: C++ Übersetzung nach Delphi

  Alt 16. Feb 2008, 15:10
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;
  Mit Zitat antworten Zitat
Johnny_W

Registriert seit: 27. Apr 2005
33 Beiträge
 
Delphi 2005 Personal
 
#6

Re: C++ Übersetzung nach Delphi

  Alt 16. Feb 2008, 17:48
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!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: C++ Übersetzung nach Delphi

  Alt 16. Feb 2008, 19:24
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.
  Mit Zitat antworten Zitat
Johnny_W

Registriert seit: 27. Apr 2005
33 Beiträge
 
Delphi 2005 Personal
 
#8

Re: C++ Übersetzung nach Delphi

  Alt 17. Feb 2008, 14:10
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!
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#9

Re: C++ Übersetzung nach Delphi

  Alt 17. Feb 2008, 19:45
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.
Moritz
  Mit Zitat antworten Zitat
Johnny_W

Registriert seit: 27. Apr 2005
33 Beiträge
 
Delphi 2005 Personal
 
#10

Re: C++ Übersetzung nach Delphi

  Alt 18. Feb 2008, 19:54
Die Frage hat sich erledigt...

Ist ja auch schon spät

EDIT\trotzdem danke mkinzler

viele Grüße!

mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.
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