 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 11.09.2007, 19:05 Titel: [GELÖST] TGA speichern... |
|
|
Hallo!
Man nehme an, man hat einen FB Bildpuffer, und möchte diesen, OHNE externe Bibliotheken in ein unkompriemiertes TGA speichern. Wie geht das? _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.09.2007, 15:58, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 11.09.2007, 19:11 Titel: |
|
|
Man nehme an, man habe den Wikipedia-Artikel gelesen [und verstanden]... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.09.2007, 19:09 Titel: |
|
|
Jaa, klasse sache, nur wenn allein der loader 300 zeilen lang ist, will ich gar nicht wissen wieviel man für einen halbwegsgut funktioniernden speicherer schreiben müsste... _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.09.2007, 19:13 Titel: |
|
|
das will ich auch nciht wissen...
aber man bekommt das sicher auch in weniger als 300 zeilen hin (wobei TGA-Loader in der Tat relativ groß sind), und man kann eben nicht alles in 10 Zeilen laden... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.09.2007, 20:02 Titel: |
|
|
Typischer Fall wieder einmal für folgenden Artikel:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/BilderVerwenden.html
Ansonsten noch Zusatzbemerkungen: Es macht in der Regel kaum Sinn, die hinterste und letzte Spezialität einer Dateispezifikation umzusetzen, jedoch aber schon so arbeiten, dass in dem Sinn unimplementierte Chunks ignoriert werden (soweit überhaupt möglich) oder bei bestimmten Attributen nur bestimmte Varianten unterstützt werden => klare "Nicht unterstützt"-Fehlermeldung zurückgeben. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.09.2007, 20:16 Titel: |
|
|
Ok. Ich glaube ich habe den "Default"-Dateikopf fertig:
Code: | Type TGA_HEADER Field = 1
idlength As Ubyte
colourmaptype As Ubyte
datatypecode As Ubyte
colourmaporigin As Ushort
colourmaplength As Ushort
colourmapdepth As Ubyte
x_origin As Ushort
y_origin As Ushort
Width As Ushort
height As Ushort
bitsperpixel As Ubyte
imagedescriptor As Ubyte
End Type
dim shared TGA_DEF as TGA_HEADER
TGA_DEF.idlength=0
TGA_DEF.colourmaptype=0
TGA_DEF.datatypecode=2
TGA_DEF.colourmaporigin=0
TGA_DEF.colourmaplength=0
TGA_DEF.colourmapdepth=0
TGA_DEF.x_origin=0
TGA_DEF.y_origin=0
TGA_DEF.width=1
TGA_DEF.height=1
TGA_DEF.bitsperpixel=32
TGA_DEF.imagedescriptor=240 ' Binary=11110000 Hexadecimal=F0 |
Zitat: | Bits 1-4: Anzahl der Attributbits pro Bildpunkt
Bit 5: horizontale Lage des Nullpunkts (0 = links, 1 = rechts)
Bit 6: vertikale Lage des Nullpunkts (0 = unten, 1 = oben)
Bit 7-8: 0 |
Was ist damit gemeint? Ich habe jetzt es erstmal so gemacht:
Bits 1-4: 1111
Bit 5: 0
Bit 6: 0
Bit 7-8: 00
Soweit inordnung? _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.09.2007, 20:42 Titel: |
|
|
einfach ausprobieren... meistens ist bei unverstädnlcihen attributen ein wert von 0 richtig  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.09.2007, 21:30 Titel: |
|
|
Naja, die ganzen Values unter .colour kommen eh auf 0, da es ja bei 32 Bit keine Palette gibt xD.
Hm.
OK, wenn ich den Header geschrieben habe, dann einfach die mit GET besorgten Bilddaten dranklatschen (nat. nur im 32 Bit Modus)?!
Oder sind die bei nem uncomprimierten TGA noch irgendwie codiert??
Ich denk' mal, dass man die Metainfos und den ganzen Rest bei seite lassen kann, sind eh erst ab 2.0, und ein 1.0 TGA reicht ja völlig... _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.09.2007, 21:37 Titel: |
|
|
du musst dich ja nicht nur auf den deutschen artikel konzentrieren... der englische artikel ist wie zu erwarten war viel detailreicher und auch mit links zu den specs... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.09.2007, 21:51 Titel: |
|
|
naja, detaillierter ist sie auf jeden falll nicht.
Zitat: | |--------|--------|------------------------------------------------------------|
| varies | varies | Image Data Field. |
| | | |
| | | This field specifies (width) x (height) pixels. Each |
| | | pixel specifies an RGB color value, which is stored as |
| | | an integral number of bytes. |
| | | |
| | | The 2 byte entry is broken down as follows: |
| | | ARRRRRGG GGGBBBBB, where each letter represents a bit. |
| | | But, because of the lo-hi storage order, the first byte |
| | | coming from the file will actually be GGGBBBBB, and the |
| | | second will be ARRRRRGG. "A" represents an attribute bit. |
| | | |
| | | The 3 byte entry contains 1 byte each of blue, green, |
| | | and red. |
| | | |
| | | The 4 byte entry contains 1 byte each of blue, green, |
| | | red, and attribute. For faster speed (because of the |
| | | hardware of the Targa board itself), Targa 24 images are |
| | | sometimes stored as Targa 32 images. |
| | | |
|
OK, also werden die eigtl. Bilddaten wie ein BMP gespeichert... _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.09.2007, 21:53 Titel: |
|
|
wie wär's damit, mal ne TGA-Datei zu "hacken"? Speichere mit einem Editor z.B. einen roten farbpunkt, einen blauen und einen grünen, dann dreh die reihenfolge mal um, stell das bild auf den kopf, etc... SO machen man das als hacker  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 13.09.2007, 21:55 Titel: |
|
|
wie detailiert willst Du es denn noch ? mehr geht eben nicht
Obwohl mich die 2Byte sache etwas verwundert... ARRRRRGGGGGBBBBB???? _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 13.09.2007, 22:02 Titel: |
|
|
hmm. wie schreibe ich einen !!ganzen!! FB Bildpuffer (ohne header ) in eine Datei??
Code: | Type TGA_HEADER Field = 1
idlength As Ubyte
colourmaptype As Ubyte
datatypecode As Ubyte
colourmaporigin As Ushort
colourmaplength As Ushort
colourmapdepth As Ubyte
x_origin As Ushort
y_origin As Ushort
Width As Ushort
height As Ushort
bitsperpixel As Ubyte
imagedescriptor As Ubyte
End Type
dim shared TGA_DEF as TGA_HEADER
TGA_DEF.idlength=0
TGA_DEF.colourmaptype=0
TGA_DEF.datatypecode=2
TGA_DEF.colourmaporigin=0
TGA_DEF.colourmaplength=0
TGA_DEF.colourmapdepth=0
TGA_DEF.x_origin=0
TGA_DEF.y_origin=0
TGA_DEF.width=1
TGA_DEF.height=1
TGA_DEF.bitsperpixel=32
TGA_DEF.imagedescriptor=240 ' Binary=11110000 Hexadecimal=F0
screenres 640,480,32
open "lala.tga" for binary as #1
line(1,1)-(43,43), &hFFFFFF
dim LaLa as TGA_HEADER = TGA_DEF
LaLa.width=640
LaLa.height=480
put #1, , LaLa
dim as any ptr Lol
lol=imagecreate(640,480)
get(1,1)-(640,480), lol
put #1, , lol
close |
_________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 13.09.2007, 22:07 Titel: |
|
|
mit eckigen klammern auslesen...? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 14.09.2007, 13:47 Titel: |
|
|
Das Ende ist dann bei 640*480*4, oder?
EDIT:
Code: | for n as integer = 0 to (640*480*4)
put #1,,lol[n]
next n |
Zitat: | Command executed:
"C:\Developing\FreeBasic\fbc.exe" "M:\TGASave.bas"
Compiler output:
M:/TGASave.bas(64) error 66: Incomplete type in 'put #1,,lol'
Results:
Compilation failed
System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.18 (08-13-2007) for win32 (target:win32)
OS: Windows XP (build 2600, Service Pack 2) |  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.09.2007, 14:32 Titel: |
|
|
was ist lol? "incomplete type"? willst du einen Type byteweise abspeichern? das geht einfach mit Put #1,,Typename... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 14.09.2007, 14:47 Titel: |
|
|
wenn die Daten eh schon unkomprimiert im 4byte Format daliegen,
dann mach ein UByte Ptr
allocate es auf die richtige groesse
lasse es mit get #ff,pos,@ptr,anzahlbyte
und dann nimmst memcpy und schiebst es direkt in dein FB Buffer
schneller gehts nimmer.... _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 14.09.2007, 15:07 Titel: |
|
|
@EP:
Ähem. Es geht hier um das speichern eines TGAs aus einem Bildpuffer, nicht umgehkehrt.
@Jojo:
lol ist der any ptr auf den bildpuffer
Code: | Type TGA_HEADER
idlength As Ubyte
colourmaptype As Ubyte
datatypecode As Ubyte
colourmaporigin As Ushort
colourmaplength As Ushort
colourmapdepth As Ubyte
x_origin As Ushort
y_origin As Ushort
Width As Ushort
height As Ushort
bitsperpixel As Ubyte
imagedescriptor As Ubyte
End Type
dim shared TGA_DEF as TGA_HEADER
TGA_DEF.idlength=0
TGA_DEF.colourmaptype=0
TGA_DEF.datatypecode=2
TGA_DEF.colourmaporigin=0
TGA_DEF.colourmaplength=0
TGA_DEF.colourmapdepth=0
TGA_DEF.x_origin=0
TGA_DEF.y_origin=0
TGA_DEF.width=1
TGA_DEF.height=1
TGA_DEF.bitsperpixel=32
TGA_DEF.imagedescriptor=240 ' Binary=11110000 Hexadecimal=F0
screenres 640,480,32
Kill "lala.tga"
open "lala.tga" for binary as #1
line(1,1)-(43,43), &hFFFFFF
dim LaLa as TGA_HEADER = TGA_DEF
LaLa.width=640
LaLa.height=480
put #1,,LaLa.idlength
put #1,,LaLa.colourmaptype
put #1,,LaLa.datatypecode
put #1,,LaLa.colourmaporigin
put #1,,LaLa.colourmaplength
put #1,,LaLa.colourmapdepth
put #1,,LaLa.x_origin
put #1,,LaLa.y_origin
put #1,,LaLa.Width
put #1,,LaLa.height
put #1,,LaLa.bitsperpixel
put #1,,LaLa.imagedescriptor
dim as any ptr Lol
lol=imagecreate(640,480)
get(1,1)-(640,480), lol
for n as integer = 0 to (640*480*4)
put #1,,lol[n]
next n
close |
_________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 14.09.2007, 15:09 Titel: |
|
|
Dir ist schon klar das ein FB Buffer (erstellt mit ImageCreate) einen Header hat ?? _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 14.09.2007, 15:11 Titel: |
|
|
Eternal_pain hat Folgendes geschrieben: | Dir ist schon klar das ein FB Buffer (erstellt mit ImageCreate) einen Header hat ?? |
Ach verdammt!
OK, so lässt es sich kompilieren, die TGA ist 1,17 MB groß.
Code: | #include "crt.bi"
Type TGA_HEADER
idlength As Ubyte
colourmaptype As Ubyte
datatypecode As Ubyte
colourmaporigin As Ushort
colourmaplength As Ushort
colourmapdepth As Ubyte
x_origin As Ushort
y_origin As Ushort
Width As Ushort
height As Ushort
bitsperpixel As Ubyte
imagedescriptor As Ubyte
End Type
dim shared TGA_DEF as TGA_HEADER
TGA_DEF.idlength=0
TGA_DEF.colourmaptype=0
TGA_DEF.datatypecode=2
TGA_DEF.colourmaporigin=0
TGA_DEF.colourmaplength=0
TGA_DEF.colourmapdepth=0
TGA_DEF.x_origin=0
TGA_DEF.y_origin=0
TGA_DEF.width=1
TGA_DEF.height=1
TGA_DEF.bitsperpixel=32
TGA_DEF.imagedescriptor=240 ' Binary=11110000 Hexadecimal=F0
screenres 640,480,32
Kill "lala.tga"
open "lala.tga" for binary as #1
line(1,1)-(43,43), &hFFFFFF
dim LaLa as TGA_HEADER = TGA_DEF
LaLa.width=640
LaLa.height=480
put #1,,LaLa.idlength
put #1,,LaLa.colourmaptype
put #1,,LaLa.datatypecode
put #1,,LaLa.colourmaporigin
put #1,,LaLa.colourmaplength
put #1,,LaLa.colourmapdepth
put #1,,LaLa.x_origin
put #1,,LaLa.y_origin
put #1,,LaLa.Width
put #1,,LaLa.height
put #1,,LaLa.bitsperpixel
put #1,,LaLa.imagedescriptor
dim as any ptr Lol
lol=imagecreate(640,480)
get(1,1)-(640,480), lol
dim as ubyte ptr picdat
picdat = allocate(640*480*4)
memcpy(picdat, lol, (640*480*4))
for n as integer = 0 to (640*480*4)
put #1,,picdat[n]
next n
close |
EDIT:
Der Header der Vers. 2 ist exakt 31 Bytes lang:
Code: | for n as integer = 31 to (640*480*4)
put #1,,picdat[n]
next n |
Zitat: | Unbekannnter Fehler beim lesen des Bildes... |  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 14.09.2007, 15:15, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|