Autor Beitrag
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 23.05.05 15:37 
Hallo,

ich möchte ein künstliches Bild erzeugen und habe die Pixel-Daten in einem Array, der, wie folgt aussieht, gespeichert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  
  TRGBRecord = record
    R, G, B: Byte;
  end;

  TRGBRecords = array of TRGBRecord;
...
...
  private
    RGBRecords: TRGBRecords;


Ich benutze ein TBitmap:
ausblenden Delphi-Quelltext
1:
Bitmap := TBitmap.Create;					


Und wenn ich versuche mittels ScanLine auf die PIXEL-Daten vom Bitmap zuzugreifen, stürzt er ab, weil er keinen Speicher dafür alloziiert hat.
Wie kann ich Speicher für beispielsweise 1000 Pixel alloziieren?

Vielen Dank,
Ralph
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Mo 23.05.05 15:40 
Habs jetzt nicht getestet aber versuch nach dem Erzeugen des Bitmaps mal dessen height und Width zu setzen.

Bis neulich ...
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 23.05.05 15:54 
Hallo,

das funktioniert nicht, da dies Eigenschaften sind.
Woher soll automatisch Speicher alloziiert werden?
Gibts vielleicht eine Methode oder so?

Vielen Dank
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Mo 23.05.05 15:58 
user profile iconrd3 hat folgendes geschrieben:
das funktioniert nicht, da dies Eigenschaften sind.

Gut, das es nicht funktioniert glaube ich ja noch aber was hat das damit zu tun, ob es Eigenschaften o.ä. sind?

user profile iconrd3 hat folgendes geschrieben:
Woher soll automatisch Speicher alloziiert werden?

Automagisch passiert garnix. Hätte ja sein können, daß das Bitmap bei Zuweisung der Größe den benötigten Speicher selber allokiert.

Bis neulich ...

edit: habs gerade mal getestet. Und siehe da Width und Height scheinen doch zu funktionieren.

Dies hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  bmp: TBitmap;
  p: PByteArray;
begin
  bmp := TBitmap.Create();
  p := bmp.ScanLine[0];
  ...

schmeißt eine "EInvalidGraphicOperation" Exception.

das hier:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  bmp: TBitmap;
  p: PByteArray;
begin
  bmp := TBitmap.Create();
  bmp.Height := 10;
  bmp.Width  := 10;
  p := bmp.ScanLine[0];
  ...

geht einwandfrei.

Sicher, daß Du nicht über das Bild hinausmalst.

btw: Ich persönlich finde den Zugriff auf einzelne Pixel per bmp.Canvas.Pixels komfortabler.

Bis neulich ...
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 23.05.05 16:11 
Hallo,

Das ist eine einfache Zuweisung. Wie soll dabei Speicher reserviert werden, wenn man keine Methode aufruft??
Bei Bitmap.LoadFromFile() wird schon automatisch Speicher reserviert, aber LoadFromFile() ist eine Methode...
Das ist aber keine schöne Lösung...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  // ==> RGBRecords wurde zuvor gesetzt
  Bitmap := TBitmap.Create;
  try
    //Bitmap.LoadFromFile('C:\TEMP\TestImgs\Bild_0.bmp');  // Ohne das LoadFromFile (Wenn kein Kommentar, dann gehts)
    for y := 0 to iHeight -1 do
    begin
      iLauf := 0;
      P := {Image1.Picture.}Bitmap.ScanLine[y];
      for x := 0 to iWidth-1 do begin
        P[iLauf] := RGBRecords[y * iWidth + x].B;
        P[iLauf + 1] := RGBRecords[y * iWidth + x].G;
        P[iLauf + 2] := RGBRecords[y * iWidth + x].R;
        iLauf := iLauf + iStep;
      end;
    end;
    Image1.Picture.Bitmap.Assign(Bitmap);
  finally
    Bitmap.free;
  end;


Vielen Dank
Ralph
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Mo 23.05.05 16:16 
user profile iconrd3 hat folgendes geschrieben:
Das ist eine einfache Zuweisung. Wie soll dabei Speicher reserviert werden, wenn man keine Methode aufruft??

Ähhmm... Nein! Properties müssen nicht zwangsläufig direkt an die Felder zuweisen sondern können ebenso mit einer set und/oder get prozedur arbeiten.
Es sind eben Properties und nicht bloß public Variablen der Klasse.

Bis neulich ...
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 23.05.05 16:27 
Hmm...

Komisch, warum das nicht funzt...?!

Auf einmal hatte es doch mit Height und Width funktioniert, aber in dem Array sind die Pixeldaten des Bildes. Wenn ich sie auslese, ist das Bild weiß. Über LoadFromFile() gehts)...

Gruß
Ralph