TSI Include, neues Bilddateiformat

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

TSI Include, neues Bilddateiformat

Beitrag von Thorium »

Ich habe ein neues Bildformat entwickelt, welches auf Dekodierungsgeschwindigkeit optimiert ist/wird.
Gedacht ist es vorrangig für die Nutzung in 2D-Spielen und hat die folgenden Merkmale:
  • schnelles Dekodieren
  • langsames Kodieren
  • verlustfrei
  • Unterstützung für Alphakanal
  • kleine Dateigröße, vergleichbar mit PNG, machmal größer, manchmal kleiner, kommt auf das jeweilige Bild an
Es ist ein wenig mit PNG vergleichbar. Zur Kompression wird ZLib verwendet und es unterstützt 3 der 4 Filter, welche PNG unterstützt für bessere Kompression.
Der Paeth-Filter wird nicht unterstützt, da er sehr langsam ist, ungefähr 10 mal langsamer als die anderen Filter. Und nebenbei hat er bei meinen Testbildern nie das optimale Ergebniss geliefert.

Ich plane meine eigene Kompression zu entwickeln und zu integrieren, welche wesentlich langsamer komprimieren wird aber eine bessere Kompressionsrate erreichen wird. Die Dekomprimierung sollte in etwa gleichschnell sein.

Das Include ist im Augenblick noch weitestgehend unoptimiert. Lediglich die Dekodierung der Filter ist ein wenig optimiert. Dennoch erreicht der Decoder schon bis zu doppelter Geschwindigkeit des PB internen PNG Decoders. Abhängig von der Plattform, dem Subsystem und natürlich dem Bild selbst.

Desweiteren unterstützt das Format 2 verlustfreie Transformationen für die Bilddaten. Sehr einfache Sortierungen der Kanäle. Das führt dazu das mein Format bei manchen Bildern PNG in der Dateigröße noch unterbietet. Verglichen mit hochoptimierten PNG's durch den PNG Optimizer. Allerdings ist es in Sachen Dateigröße im Vergleich mit PNG bei Bildern mit wenigen Farben im Nachteil, da es im Augenblick keine Farbindizierung unterstützt. Die Pixel werden immer in 32bit gespeichert.

Es sollte auf jeder Plattform die PB unterstützt und jedem Subsystem welches den Alphakanal unterstützt laufen. Allerdings ist es noch nicht gut durchgetestet und befindet sich noch im Betastadium.

Hier ist das Include: http://www.GameTreasure.de/downloads/TsiInclude.zip benötigt PB 4.40
Kommt mit einem Plugin für XnView zum Anzeigen und Speichern (Konvertieren) von TSI's.
Mit einem "stand alone" Konverter (nur Windows) und einem "stand alone" Viewer (nur Windows).

Hier noch die wichtigsten Prozeduren des Includes:

Tsi_LoadTsi2Image(FileName.s)
Ähnlich wie PB's LoadImage. Läd ein TSI von der Festplatte und dekodiert es in ein PB Image.

Tsi_CatchTsi2Image(*Tsi)
Ähnlich wie PB's CatchImage. Dekodiert ein TSI im Speicher in ein PB Image.

Tsi_LoadTsi2Sprite(FileName.s)
Ähnlich wie PB's LoadSprite. Läd ein TSI von der Festplatte und dekodiert es in ein PB Sprite.

Tsi_CatchTsi2Sprite(*Tsi)
Ähnlich wie PB's CatchSprite. Dekodiert ein TSI im Speicher in ein PB Sprite.

Tsi_BestSaveFromImage(Image.i, FileName.s)
Ähnlich wie PB's SaveImage. Kodiert ein PB Image zu einem TSI und speichert es auf die Festplatte.

Tsi_BestSaveFromSprite(Sprite.i, FileName.s)
Ähnlich wie PB's SaveSprite. Kodiert ein PB Sprite zu einem TSI und speichert es auf die Festplatte.

Tsi_BestSave2MemoryFromImage(Image.i, *TsiSize.Integer)
Ähnlich wie PB's SaveImage, aber es legt das TSI in den Speicher anstatt es auf die Festplatte zu speichern.

Tsi_BestSave2MemoryFromSprite(Sprite.i, *TsiSize.Integer)
Ähnlich wie PB's SaveSprite, aber es legt das TSI in den Speicher anstatt es auf die Festplatte zu speichern.

Also ist es sehr einfach zu nutzen. Es gibt noch eine Prozeduren mehr, die mehr Kontrolle ermöglichen. Aber ihr könnt das Include selbst erkunden. Alle Prozeduren sind kommentiert mit dem was sie tun und was sie zurückgeben.

Ich hoffe jemand kanns gebrauchen.
Wenn ich mit den Optimierungen fertig bin und meine eigene Kompression hinzugefügt habe, werde ich ein 2D-Animationsformat machen (TSA).
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: TSI Include, neues Bilddateiformat

Beitrag von Thorium »

Ich hab vergessen zu schreiben dass das Include im Augenblick (PB 4.40B5) nicht mit dem OpenGL Subsystem und Sprites funktioniert. Das liegt an folgendem PB Bug: http://www.purebasic.fr/english/viewtop ... =4&t=38626

Das Laden und Speichern eines TSI's mit dem OpenGL Subsystem schlägt fehl und Tsi_LastError wird auf #Tsi_Error_PbSpriteWrongPixelFormat gesetzt, welches das korrekte Verhalten für diesen Fall ist. Es ist kein Bug des TSI Includes.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: TSI Include, neues Bilddateiformat

Beitrag von Thorium »

Gerade v0.02 hochgeladen: http://www.gametreasure.de/downloads/TsiInclude.zip

Transformationsdecoding wurde für x86 und x64 in Assembler neu geschrieben, was in einem Geschwindigkeitszuwachs beim TSI Dekodieren von 12% resultiert.

Hier eine Tabelle in der Dateigröße und Dekodierungsgeschwindigkeit von TSI und PNG verglichen werden:
Das Bild, welches für den Test verwand wurde kann hier in allen getesteten Versionen runtergeladen werden: http://www.gametreasure.de/downloads/TestImages.zip

Code: Alles auswählen

File Size Comparison

3,145,728b = 3,072kb 100.00% size : raw image data
2,200,459b = 2,149kb  69.95% size : PNG saved with PureBasic
1,470,636b = 1,436kb  46.75% size : PNG saved with Gimp
1,313,207b = 1,282kb  41.73% size : PNG optimized with PNG Optimizer
1.266.965b = 1,237kb  40.27% size : TSI saved with TSI include

Decoding Speed Comparison

image on x86 Windows
68ms 100.00% time needed : PNG saved with Gimp
56ms  82.35% time needed : PNG optimized with PNG Optimizer
39ms  57.35% time needed : PNG saved with PureBasic
29ms  42.65% time needed : TSI saved with TSI include

image on x64 Windows
62ms 100.00% time needed : PNG saved with Gimp
52ms  83.87% time needed : PNG optimized with PNG Optimizer
38ms  61.29% time needed : PNG saved with PureBasic
28ms  45.16% time needed : TSI saved with TSI include

sprite with DirectX7 on x86 Windows
79ms 100.00% time needed : PNG saved with Gimp
66ms  83.54% time needed : PNG optimized with PNG Optimizer
48ms  60.76% time needed : PNG saved with PureBasic
38ms  48.10% time needed : TSI saved with TSI include

sprite with DirectX7 on x64 Windows
71ms 100.00% time needed : PNG saved with Gimp
62ms  87.32% time needed : PNG optimized with PNG Optimizer
47ms  66.20% time needed : PNG saved with PureBasic
37ms  52.11% time needed : TSI saved with TSI include

sprite with DirectX9 on x86 Windows
74ms 100.00% time needed : PNG saved with Gimp
64ms  86.49% time needed : PNG optimized with PNG Optimizer
45ms  60.81% time needed : PNG saved with PureBasic
34ms  45.95% time needed : TSI saved with TSI include

sprite with DirectX9 on x64 Windows
66ms 100.00% time needed : PNG saved with Gimp
58ms  87.88% time needed : PNG optimized with PNG Optimizer
42ms  63.64% time needed : PNG saved with PureBasic
33ms  50.00% time needed : TSI saved with TSI include
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: TSI Include, neues Bilddateiformat

Beitrag von Regenduft »

Sehr interessant! :allright:
Muss ich mir mal bei Gelegenheit in Ruhe anschauen...

Kleine Frage: Du optimierst fleißig in Assembler, aber warum dann z.B. sowas hier...

Code: Alles auswählen

Macro Tsi_BGRA2RGBA(Pixel)
  (Pixel & $FF00FF00) | (Pixel & $FF) << 16 | ((Pixel >> 16) & $FF)
EndMacro
... anstatt BSWAP und ROL oder ROR? Wenn Du das so machst gibt es doch bestimmt einen versteckten tieferen Sinn... *grübel*

Arbeitest Du eigentlich noch weiter am Source oder ist der abgeschlossen? Ich liebe so gut kommentierte Quelltexte! Wenn man vor dem Source "durchgruschdeln" weiß um was es geht, kann man viel einfacher was lernen! Danke! :praise:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: TSI Include, neues Bilddateiformat

Beitrag von Thorium »

Regenduft hat geschrieben: Kleine Frage: Du optimierst fleißig in Assembler, aber warum dann z.B. sowas hier...

Code: Alles auswählen

Macro Tsi_BGRA2RGBA(Pixel)
  (Pixel & $FF00FF00) | (Pixel & $FF) << 16 | ((Pixel >> 16) & $FF)
EndMacro
... anstatt BSWAP und ROL oder ROR? Wenn Du das so machst gibt es doch bestimmt einen versteckten tieferen Sinn... *grübel*
Dieses Makro ist natürlich alles andere als optimiert. Der Sinn dahinter ist das ich den Code optimieren wollte auf den es ankommt. TSI ist dazu vorgesehen die Bilddaten in dem Format zu speichern, wie man sie später braucht. Die Pixelkonvertierung ist nur zur Kompatiblität da und sollte eigentlich garnicht zum Einsatz kommen. Das ist eins der Geheimnisse warum TSI so schnell dekodiert. :wink:
Regenduft hat geschrieben: Arbeitest Du eigentlich noch weiter am Source oder ist der abgeschlossen? Ich liebe so gut kommentierte Quelltexte! Wenn man vor dem Source "durchgruschdeln" weiß um was es geht, kann man viel einfacher was lernen! Danke! :praise:
Jaein.
Im Augenblick liegt das Projekt auf Eis aber ich habe einige Zeit an TSI2 gearbeitet. Das Format unterstützt nen haufen Pixelformate wie Indexed, 16bit RGB, Greyscale bis 32bit, 64bit RGB, Paletten, LZMA Komprimierung und hat weiter optimierten Code und ist somit noch schneller.
Allerdings fehlt da noch einiges zur Fertigstellung. Ich kann den Code ja mal hochladen, falls intresse besteht. Einiges funktioniert auch.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: TSI Include, neues Bilddateiformat

Beitrag von Regenduft »

Thorium hat geschrieben:Ich kann den Code ja mal hochladen, falls intresse besteht. Einiges funktioniert auch.
Danke für's Angebot, aber nur wenn's keine Umstände macht, denn im Moment werde ich mich damit eh nicht auseinander setzen. Habe mir aber ein Lesezeichen gesetzt und werde bei Gelegenheit mal wieder reinschauen.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: TSI Include, neues Bilddateiformat

Beitrag von Rings »

Thorium hat geschrieben: Im Augenblick liegt das Projekt auf Eis aber ich habe einige Zeit an TSI2 gearbeitet. Das Format unterstützt nen haufen Pixelformate wie Indexed, 16bit RGB, Greyscale bis 32bit, 64bit RGB, Paletten, LZMA Komprimierung und hat weiter optimierten Code und ist somit noch schneller.
Allerdings fehlt da noch einiges zur Fertigstellung. Ich kann den Code ja mal hochladen, falls intresse besteht. Einiges funktioniert auch.
Bevor solch Schmuckstücke tod in der Ecke liegen, wie wärs mit einem Upload ?
Ich beschäftige mich doch ab und an mit der Bildcompression laufender Bilder, da ist ein bisschen Wissen
und Studium der Compression statischer Bilder sowie die Pxelformate auch sehr hilfreich.
Also Kurzum, ich hab Interesse dran ;)
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: TSI Include, neues Bilddateiformat

Beitrag von Thorium »

Ok, hier ist das unfertige TSI2 Include.
Wie gesagt es ist unfertig, also einiges ist nicht implementiert anderes benötigt Überarbeitung.

Unterstütze Pixelformate sind:

Code: Alles auswählen

#Tsi_Format_16Bit_4444          =   1
#Tsi_Format_16Bit_5551          =   2
#Tsi_Format_16Bit_565           =   3
#Tsi_Format_24Bit               =   4
#Tsi_Format_32Bit               =   5
#Tsi_Format_48Bit               =   6
#Tsi_Format_64Bit               =   7
#Tsi_Format_Index1Bit24Pal      =   8
#Tsi_Format_Index1Bit32Pal      =   9
#Tsi_Format_Index1Bit24PalAlpha =  10
#Tsi_Format_Index2Bit24Pal      =  11
#Tsi_Format_Index2Bit32Pal      =  12
#Tsi_Format_Index2Bit24PalAlpha =  13
#Tsi_Format_Index4Bit24Pal      =  14
#Tsi_Format_Index4Bit32Pal      =  15
#Tsi_Format_Index4Bit24PalAlpha =  16
#Tsi_Format_Index8Bit24Pal      =  17
#Tsi_Format_Index8Bit32Pal      =  18
#Tsi_Format_Index8Bit24PalAlpha =  19
#Tsi_Format_Grayscale1Bit       =  20
#Tsi_Format_Grayscale2Bit       =  21
#Tsi_Format_Grayscale4Bit       =  22
#Tsi_Format_Grayscale8Bit       =  23
#Tsi_Format_Grayscale16Bit      =  24
#Tsi_Format_Grayscale32Bit      =  25

#Tsi_Format_24BitIn32Bit        = 100
#Tsi_Format_48BitIn64Bit        = 101
Die letzten beiden sind nicht direkt vom Dateiformat unterstützt, da unoptimal zum Speichern. Aber Dekodierung zu diesen Formaten wird unterstützt.

Implementiert dürften alle bis auf Indexed (Paletten) sein.
Konvertierung zwischen den Formaten ist sehr langsam, da hier erst in ein zwischenformat kodiert wird um es zu vereinfachen. Später sollten dann einzelne oft verwendete Konvertierungen optimal implementiert werden.

Diese Pixelformate können dann auch noch unterschiedliche Channelorder und Byteorder haben:

Code: Alles auswählen

#Tsi_ChannelOrder_BGRA    = 1
#Tsi_ChannelOrder_ABGR    = 2
#Tsi_ChannelOrder_RGBA    = 3
#Tsi_ChannelOrder_ARGB    = 4

#Tsi_ByteOrder_LittleEndian = 1
#Tsi_ByteOrder_BigEndian    = 2
Eine Transparente Farbe wird unterstützt. (Für Pixelformate ohne Alphakanal)

__________________________________________________
Code-Tags hinzugefügt
03.02.2013
RSBasic
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: TSI Include, neues Bilddateiformat

Beitrag von Rings »

sorry für den delay,

aber ein Big Thx von mir Thorium !!!!
:allright: :allright: :allright:
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: TSI Include, neues Bilddateiformat

Beitrag von STARGÅTE »

Ich habe eine Frage zu dem #Tsi_Format_Grayscale32Bit Format
Mich mich heißt das 2^32 Gautöne, was ja für die Anzeige völlig nutzlos ist.
Aber gibt es da noch einen "tieferen Sinn"?

Ich sehe, dass du Farbe (RGB) in 32Bit-Grau konvertierst, aber selbst da würde nur 768 Grautöne entstehen.

Außerdem gibts da n Fehler:

Code: Alles auswählen

          Pixel32 = (Red + Green + Blue) / 3
          
          If SrcPixelSize < 6
            Pixel32 = Pixel32 * 16843009
          ElseIf          
            Pixel32 = Pixel32 * 65537
          EndIf
Pixel32 ist eine Long, somit vernichtest du die Informationen, weil du erst durch 3 dividierst und dann nur noch 256 Stufen da sind. Also erst Multiplizieren.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten