PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi: BMP-Größe herauskriegen ohne Binärzugriff?


aths
2004-04-21, 11:30:57
Folgendes Problem: Ich möchte eine BMP-Datei anzeigen, die größer ist als das Fenster (bzw. der Monitor.) Dazu schwebt mir vor, zwei Modi zur Verfügung zu stellen:

1. Das Form bekommt halt Scrollbars, und man scrollt sich durch. Dazu muss ich aber wissen, wie groß das TImage gemacht werden muss. Kann ich das herauskriegen, ohne das BMP-File binär öffnen zu müssen (um dann an der richtigen Stellen X und Y-Größe zu lesen?)

2. Das BMP wird um einen ganzzahligen Faktor herunterskaliert, damit es ins Fenster passt. Nun ist es etwas langsam, das BMP byteweise in ein Feld einzulesen. Kann ich, nachdem es mit .picture.loadfromfile gelesen wird, nicht irgendwie lesend auf den binären Puffer für das Bild zugreifen?

Asmodeus
2004-04-21, 12:28:23
Original geschrieben von aths
Folgendes Problem: Ich möchte eine BMP-Datei anzeigen, die größer ist als das Fenster (bzw. der Monitor.) Dazu schwebt mir vor, zwei Modi zur Verfügung zu stellen:

1. Das Form bekommt halt Scrollbars, und man scrollt sich durch. Dazu muss ich aber wissen, wie groß das TImage gemacht werden muss. Kann ich das herauskriegen, ohne das BMP-File binär öffnen zu müssen (um dann an der richtigen Stellen X und Y-Größe zu lesen?)

2. Das BMP wird um einen ganzzahligen Faktor herunterskaliert, damit es ins Fenster passt. Nun ist es etwas langsam, das BMP byteweise in ein Feld einzulesen. Kann ich, nachdem es mit .picture.loadfromfile gelesen wird, nicht irgendwie lesend auf den binären Puffer für das Bild zugreifen?

Zu 1.

Mit Delphi kenn ich mich zwar Null aus, aber die Größe eines BMP-Bildes ohne Zugriff auf den Header der BMP-Datei herauszubekommen halte ich für kaum möglich. Oder meinst Du mit Binärzugriff was ganz anderes?

Zu 2.

Eigentlich ist es doch bei jeder modernen Programiersprache so, wenn man ein Image einliest erhält man ein "irgendwie geartetes" Objekt zurück, in dem Informationen wie Höhe, Breite, Farbtiefe usw gespeichert sind. Und dieses Objekt enthält dann auch immer einen Zeiger auf einen Speicherbereich, der die Pixeldaten enthält. Und mit Hilfe dieses Zeigers kannst du dann ja lesend auf die Daten zugreifen, ohne dass du sie nun byteweise auslesen musst.

Carsten.

Matti
2004-04-21, 12:44:36
1.
image.autosize:=true;
form.autoscroll:=true; //ist per default schon true

2.
image.stretch:=true;
...und dann mit image.width & image.height die passende Größe einstellen. Die Original-Größe bekommste mit image.picture.width /.height.

Für schnelle Low-Level Pixel-Operationen siehe tbitmap.scanline in der Hilfe.

aths
2004-04-21, 12:52:51
Original geschrieben von Matti
1.
image.autosize:=true;Ah, g00d.

Original geschrieben von Matti
2.
image.stretch:=true;
...und dann mit image.width & image.height die passende Größe einstellen. Die Original-Größe bekommste mit image.picture.width /.height.Hrnja ich will aber downfiltern. *

Original geschrieben von Matti
Für schnelle Low-Level Pixel-Operationen siehe tbitmap.scanline in der Hilfe. Jopp, nur muss ich erst mal an die Daten rankommen, und habe wenig Lust, das File binär ein- oder das TImage mit .canvas.pixels auszulesen.

* edit: Ich will doch nicht mehr downfiltern, das reicht auch so. Danke.