nGradientImage ist ein neuartiges Bildformat, das Bilder in Farbverläufe und Flächen konvertiert. Durch diese effiziente Zerlegung des Bildinhalts wird die Dateigröße bei sehr guter Qualität radikal reduziert und erreicht sowohl kleinere Dateien als auch eine bessere Qualität als alle mir bekannten Bildcodecs.
Durch die 56i5-nColor-Farbkompression kann die Dateigröße mit kleinen Qualitätsverlusten noch einmal auf gut die Hälfte reduziert werden. Mit der 888-nColor-Kompression werden die Farben gegenüber RGB verlustfrei gespeichert und lediglich die Bildgeometrie verändert.
nGI benutzt zusätzlich noch eine BZip2-Kompression, die allerdings durch die starke vorhergehende Kompression nur ca. 50% einspart und damit oft immer noch leistungsfähiger als JPG und andere weit verbreitete Formate ist.
Beispiel (nGI musste wegen fehlender Browserunterstützung hier als PNG wiedergegeben werden):
Spoiler anzeigen
JPG Qualität Minimal = 44,5 KB
nGI v2, 95% Qualität = 50,6 KB
nGI v2, 0% Qualität, 56i5-nColor-Kompression = 16,4 KB
Man sieht, das JPG trotz extrem schlechter Qualität eine 3x größere Datei erzeugt als nGI bei maximalen Kompressionseinstellungen. Dabei arbeitet nGI garantiert Artefaktfrei und erzeugt keine zusätzlichen Daten, wie JPG, das teilweise Ränder zieht.
Ein anderes Beispiel:
Spoiler anzeigen
JPG Qualität Minimal = 6,6 KB
nGI 50% Qualität, 56i5-nColor-Kompression = 6,3 KB
nGI 50% Qualität = 9,1 KB
Bei diesem Beispiel sieht man, dass nGI bei 50% Qualität schon die Dateigröße von JPG erreicht und somit noch viel Raum in Richtung 0% lässt
Download:
nGI-Konvertierungstool: nGI v2.zip (112,79 KB)
nGI-Beispiele: nGI Test.zip (8,81 MB)
nGI-Lib (DLL): nGIv2lib.zip (106,17 KB)
Bedienung des Tools:
Die Bedienung sollte selbsterklärend sein.
Als Erstes muss immer die Datenbank geladen werden, dann wird die Qualität eingestellt und ausgewählt, ob 56i5-nColor verwendet werden soll. Dann klickt man auf "Komprimieren" und wird nach altem und neuem Dateiname gefragt.
Um ein Bild anzusehen, klickt man auf "Dekomprimieren". Ein Dateiname wird dann von selbst gewählt.
Screenshot:
DLL:
Die Dll enthält eine Klasse "nGI.Encoder", über die das Encodieren läuft:
Beispiel:
Dabei muss der Ordner nGIBaseImages8x8 im aktuellen Pfad liegen (genauso die ICSharpCode.SharpZipLib.dll)
Systemanforderungen:
.Net 3.5, Rest sollte egal sein.
Die Frage ist jetzt: Was soll ich damit machen?
Erweiterungspotezial liegt zB noch darin, statt Get/SetPixel direkt im Bild zu arbeiten und den Codec nach C zu portieren, da viele Bitshifts und co benutzt werden, die dabei weit schneller wären.
Achja, wer die DLL nutzt: Namensnennung wäre nett, dekompilieren sollte nicht nötig sein und deswegen auch besser gelassen werden (und vllt mich anschreiben, wenns um kommerzielle Produkte geht, Freeware darf die DLL gern so benutzen, aber da wirds manchmal heikel)
Ne Version für .net 2 folgt.
Durch die 56i5-nColor-Farbkompression kann die Dateigröße mit kleinen Qualitätsverlusten noch einmal auf gut die Hälfte reduziert werden. Mit der 888-nColor-Kompression werden die Farben gegenüber RGB verlustfrei gespeichert und lediglich die Bildgeometrie verändert.
nGI benutzt zusätzlich noch eine BZip2-Kompression, die allerdings durch die starke vorhergehende Kompression nur ca. 50% einspart und damit oft immer noch leistungsfähiger als JPG und andere weit verbreitete Formate ist.
Beispiel (nGI musste wegen fehlender Browserunterstützung hier als PNG wiedergegeben werden):
JPG Qualität Minimal = 44,5 KB
nGI v2, 95% Qualität = 50,6 KB
nGI v2, 0% Qualität, 56i5-nColor-Kompression = 16,4 KB
Man sieht, das JPG trotz extrem schlechter Qualität eine 3x größere Datei erzeugt als nGI bei maximalen Kompressionseinstellungen. Dabei arbeitet nGI garantiert Artefaktfrei und erzeugt keine zusätzlichen Daten, wie JPG, das teilweise Ränder zieht.
Ein anderes Beispiel:
JPG Qualität Minimal = 6,6 KB
nGI 50% Qualität, 56i5-nColor-Kompression = 6,3 KB
nGI 50% Qualität = 9,1 KB
Bei diesem Beispiel sieht man, dass nGI bei 50% Qualität schon die Dateigröße von JPG erreicht und somit noch viel Raum in Richtung 0% lässt
Download:
nGI-Konvertierungstool: nGI v2.zip (112,79 KB)
nGI-Beispiele: nGI Test.zip (8,81 MB)
nGI-Lib (DLL): nGIv2lib.zip (106,17 KB)
Bedienung des Tools:
Die Bedienung sollte selbsterklärend sein.
Als Erstes muss immer die Datenbank geladen werden, dann wird die Qualität eingestellt und ausgewählt, ob 56i5-nColor verwendet werden soll. Dann klickt man auf "Komprimieren" und wird nach altem und neuem Dateiname gefragt.
Um ein Bild anzusehen, klickt man auf "Dekomprimieren". Ein Dateiname wird dann von selbst gewählt.
Screenshot:
DLL:
Die Dll enthält eine Klasse "nGI.Encoder", über die das Encodieren läuft:
VB.NET-Quellcode
- Public Structure Color ' Speichert Farben
- Public Structure OutDataPoint ' Speichert die Farbverläufe nach dem ersten Encodierlauf
- Public Structure OutData ' Speichert den Output einer Encodierung
- ' Zeigt, ob Init bereits aufgerufen ist
- Public ReadOnly Property Inited As Boolean
- ' Lädt die Geometriedatenbank (muss am Anfang aufgerufen werden)
- Public Sub Init()
- ' Komprimiert eine Bitmao
- Public Function Compress(ByVal Bmp As Bitmap, ByVal Quality As Integer) As OutData
- Public Function Compress(ByVal Bmp As Bitmap, ByVal Quality As Integer, ByVal Progress As ProgressBar) As OutData
- ' Dekomprimiert zu einer Bitmap
- Public Function Decompress(ByVal Data As OutData) As Bitmap
- Public Function Decompress(ByVal Data As OutData, ByVal Progress As ProgressBar) As Bitmap
- ' Speichert die komprimierten Daten, auf Wunsch mit encodierten Farben
- Public Sub Save(ByVal File As String, ByVal Data As OutData, ByVal Use56i5nColorCompression As Boolean)
- ' Lädt Daten aus einer Datei
- Public Function Load(ByVal File As String) As OutData
Beispiel:
VB.NET-Quellcode
- ' Vorbereiten
- Dim C As New nGIv2lib.nGI.Encoder
- C.Init()
- ' Komprimieren
- Dim Out As nGIv2lib.nGI.OutData
- Dim Img As Bitmap = Bitmap.FromFile("MeineBitmap.png")
- Out = C.Compress(Img, 50)
- C.Save("Komprimiert.ng2", Out, False)
- ' Dekomprimieren
- Dim Data As nGIv2lib.nGI.OutData
- Dim Img2 As Bitmap
- Data = C.Load("Komprimiert.ng2")
- Img2 = C.Decompress(Data)
- Img2.Save("NeueBitmap.png")
Dabei muss der Ordner nGIBaseImages8x8 im aktuellen Pfad liegen (genauso die ICSharpCode.SharpZipLib.dll)
Systemanforderungen:
.Net 3.5, Rest sollte egal sein.
Die Frage ist jetzt: Was soll ich damit machen?
Erweiterungspotezial liegt zB noch darin, statt Get/SetPixel direkt im Bild zu arbeiten und den Codec nach C zu portieren, da viele Bitshifts und co benutzt werden, die dabei weit schneller wären.
Achja, wer die DLL nutzt: Namensnennung wäre nett, dekompilieren sollte nicht nötig sein und deswegen auch besser gelassen werden (und vllt mich anschreiben, wenns um kommerzielle Produkte geht, Freeware darf die DLL gern so benutzen, aber da wirds manchmal heikel)
Ne Version für .net 2 folgt.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „niwax“ ()