D
audacia schrieb:
DerAltenburger schrieb:
Ich sagte ja schonmal, ich hab nur 32Bit System/ Compiler.
Ah, jetzt seh' ich's auch, du hast in einen Zitatblock reingeschrieben. Bitte mach das nicht, sowas überliest man leicht.
Sorry, versuch ich sonst auch nicht zu machen...
audacia schrieb:
DerAltenburger schrieb:
Ist nicht die Summe der Bildflächen aller MIP- Maps annähernd die Grösse des Originals?
Ungefähr, ja. Aber du mußt sie ja nicht alle speichern, die paar kleinsten dürften reichen.
Wenn ich das Komplettbild eingezoomt darstellen will, muss ich doch vom ganzen Bitmap ausgehend Skalieren/ Interpolieren.
Oder: Das erste verkleinerte Mipmap (1/2 Grösse) muss doch vom ganzen Bitmap ausgehend Skalieren/ Interpolieren.Die Anzeige kann am Ende ja dann ein geeignetes Mipmap verwenden...
Ok: die erste Stufe der Verklerinerung/ Anzeige kann ja direkt aus dem MapViewOfFile heraus berechnen...
Dann brauche ich kein TBitmap...
audacia schrieb:
Deine Verzerrungstransformation dürfte ja invertierbar sein, oder? Dann mach es doch folgendermaßen:
- das Ursprungsbild lädst du als memory-mapped file und blendest erstmal nur den Header ein
- du kannst ja berechnen, wie groß das Zielbild sein muß; also legst du die Zieldatei mit CreateFile() an und benutzt dann SetEndOfFile(), um die Dateigröße zu setzen
- jetzt unterteilst du das Zielbild (N×MpxN \times M \; \mathrm{px}N×Mpx) in Zeilenblöcke (kkk Blöcke mit je N×MkpxN \times \frac{M}{k} \mathrm{px}N×kMpx), so daß jeder Zeilenblock zMBz \; \mathrm{MB}zMB groß ist
- für einen Zeilenblock im Zielbild kannst du ausrechnen, auf welche Zeilen des Ursprungsbildes du zugreifen können mußt; also rufst du für beide Bilder MapViewOfFile() mit dem jeweiligen Speicherbereich auf
- für jeden Pixel im Zeilenblock bestimmst du dann mittels deiner inversen Transformation die entsprechenden Pixel im Originalbild
- dann schließt du die beiden Mappings mit UnmapViewOfFile() und gehst zum nächsten Zeilenblock
Mit der Methode brauchst du nur etwa 3×zMB3 \times z \; \mathrm{MB}3×zMB Speicher. Wie du zzz bemißt, ist deine Wahl; machst du es größer, hast du weniger Festplattenzugriffe, machst du es kleiner, paßt der Speicherbereich vielleicht in den CPU-Cache. Müßtest du mal mit rumexperimentieren.
Meine Transformation ist schon invertiert - die lässte sich immer invertieren.
(Man muss ja zu Zielpixel berechnen aus welchen Quellpixel(n) die Daten kommen...
Das wird das wohl auf FileMapping hinauslaufen!
Ich wollte nur die Daten nach dem Einlesen gern in einem TBitmap haben:
- Da kann ich ohne Probleme auf Scanlines/ Pixel zugreifen
- Da muss ich mich NICHT mit Bitmap- Header & Co rumschlagen
- Da brauche ich auch keine "internen" Kenntnisse zu BM- Dateien...
Ist aber ne Form der Bequemlichkeit. Wenn es nicht anders geht, muss eben was Anderes her - und wenn das FileMapping ist !
Bis zu ca 300MPixel habe ich auch ein eigenes TMyBitmap:
- liest Daten Zeilenweise ein! (RGB- Tripel) je einer Zeile
- Alle diese "ScanLines" werden in Array gespeichert für schnellen Zugriff
- Es braucht KEINEN RAM- Block für das ganze Bild. Nur jew. für eine Zeile.
Problem ist nur, die Daten aus der Datei in meine Klasse zu bekommen. Das geht am einfachsten aus einem Borland TBitmap.
Aber mit FileMapping sollte das auch gehen - Du hast ja viele Tips gegeben.
- Meine Zoom- Anzeige ist so aufgebaut, dass die Daten in ein komplettes TBitmap kommen und daraus dann die Anzeige (gepuffert) skaliert wird. Das müsste ich dann ev. auch auf FileMapping umstellen. Das wollte ich eigentlich vermeiden, aber wenns nötig ist sollte das schon gehen.
Gruss & Dank
Frank