Bilder in Datei schreiben und wieder auslesen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Bilder in Datei schreiben und wieder auslesen

BeitragMi, Okt 14, 2009 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stelle mir aus mehreren Dateien eine große zusammen. Unter anderem sind Bilddateien enthalten. Jetzt möchte ich die Bilder direkt aus der großen Datei in ein TImage laden ohne sie temporär zwischenspeichern zu müssen.

So stelle ich die große Datei zusammen
BlitzMax: [AUSKLAPPEN]
s = WriteFile("test.map")

'datei 1 in den stream schreiben
x = ReadFile("bmp.bmp")
WriteInt(s, StreamSize(x))
CopyStream(x, s)
CloseFile(x)

'datei 2 in den stream schreiben
x = ReadFile("png.png")
WriteInt(s, StreamSize(x))
CopyStream(x, s)
CloseFile(x)

'datei 3 in den stream schreiben
x = ReadFile("jpg.jpg")
WriteInt(s, StreamSize(x))
CopyStream(x, s)
CloseFile(x)

CloseFile(s)


Ich habe die länge der Dateien und die Datei selber. Klar könnte ich die Daten so in einen RamStram laden, aber dann? Ich müsste ja irgendwie mit LoadImage den Stream anzapfen.
Hat da jemand einen Tipp?
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
  • Zuletzt bearbeitet von Ratchet am Mi, Okt 14, 2009 15:35, insgesamt 2-mal bearbeitet

D2006

Administrator

BeitragMi, Okt 14, 2009 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest es in eine TBank zwischenspeichern und die Bank direkt LoadImage übergeben.-
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

BladeRunner

Moderator

BeitragMi, Okt 14, 2009 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ganz einfach das Image in einen Stream speichern als auch laden.
Code: [AUSKLAPPEN]
'laden von aktueller Streamposition:
Local stream:TStream = ReadFile("bla.map")
Local image:TImage = LoadImage(stream)


'speichern von image:timage
Local stream:TStream = WriteFile("Blub.map")
SavePixmapPNG(image.pixmaps[0] , stream)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ratchet

BeitragMi, Okt 14, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@D2006: Die Bank Variante werde ich mal versuchen.
@BladeRunner: Diese Variante verstehe ich nicht ganz. Wenn so ab der aktuellen Stream Position geladen wird, würde das ja bedeutet, dass der gesamte Rest der Datei ausgelesen würde. Aber es können ja noch andere Bilder/Daten in der Datei folgen. Ich müsste also schon irgendwie eine Länge angeben wieviel Bytes ich lesen möchte um wirklich nur das aktuelle Bild zu bekommen.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

BladeRunner

Moderator

BeitragMi, Okt 14, 2009 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich wird der Stream von der aktuellen Stelle für die Länge der Bilddatei eingelesen.
Dementsprechend ist ein solches Vorgehen vor allem interessant wenn Du einmal zu Start des Programms alle Bilder einliesst, in ein Array o.ä.
So hangelst Du Dich in der Map von Bild zu Bild ohne weitere Angaben zu Speichern.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ratchet

BeitragMi, Okt 14, 2009 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so, nun versteh ich. Wird sozusagen automatisch erkannt wenn man es mit SavePixmapPNG in den Stream schreibt.

Hab es nun über die Bank gelöst, funktioniert wunderbar. Danke Leute.

Auslesen:
BlitzMax: [AUSKLAPPEN]
bank = New TBank
stream = ReadFile("test.map")
size = ReadInt(stream) 'größe/länge der datei die nun kommt
bankstream = CreateBankStream(bank)
CopyBytes(stream, bankstream, size)
img = LoadImage(bank)
CloseFile(stream)
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
 

Xar

BeitragFr, Okt 16, 2009 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu habe ich auch eine Frage: Wird das jetzt so gelöst, weil die Datei "under anderem" Bilder enthält, bzw. weil es keine reine Bilddatei ist?

Ich lade mir Bilddateien immer direkt über LoadImage oder direkt in ein Pixmap und habe sie so umgehend verfügbar. Notfalls lese ich das Pixmap in ein Array aus, wenn ich mit den Bildpunkten Sachen anstellen will.

Ist das nicht so sinnvoll?

DaysShadow

BeitragFr, Okt 16, 2009 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Methode ist die ganz normale und richtige würde ich sagen, dass worum es hier ging ist wohl eher eine Art Schutz vor Benutzung seiner Bilder, Sounds usw.
Indem er seine Daten alle in eine Datei schreibt, weiß er der Benutzer nicht wo was in der Datei liegt und kann keinen Unsinn damit anstellen Wink
Machen ja auch die großen Firmen so, mir fällt da immer z.B. Call of Duty und dessen .pak dateien ein.

MfG DaysShadow
Blessed is the mind too small for doubt

Ratchet

BeitragFr, Okt 16, 2009 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Es handelt sich um eine Leveldatei, die den Aufbau des Levels beschreibt. Die meisten Infos sind Bytes oder Ints.
Der Endbenutzer soll nachher selber Level erstelle und dabei bestimmte Bilder austauschen können (Themes). Und da ich es einfach unpraktisch finde dann immer Mappdatei, Bilddatei1, Bilddatei2 zu haben speicher ich nun einfach die Bilder mit in die Mapdatei. Ist praktisch und ich muss mir keine Sorgen darum machen dass eine Datei mal nicht vorhanden sein könnte.
Mit Dateien schützen hat das nichts zu tun Smile
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group