nGI Bildkompressor/Bildformat (Draft 2.0)

    • Beta

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von niwax.

      nGI Bildkompressor/Bildformat (Draft 2.0)

      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:

      VB.NET-Quellcode

      1. Public Structure Color ' Speichert Farben
      2. Public Structure OutDataPoint ' Speichert die Farbverläufe nach dem ersten Encodierlauf
      3. Public Structure OutData ' Speichert den Output einer Encodierung
      4. ' Zeigt, ob Init bereits aufgerufen ist
      5. Public ReadOnly Property Inited As Boolean
      6. ' Lädt die Geometriedatenbank (muss am Anfang aufgerufen werden)
      7. Public Sub Init()
      8. ' Komprimiert eine Bitmao
      9. Public Function Compress(ByVal Bmp As Bitmap, ByVal Quality As Integer) As OutData
      10. Public Function Compress(ByVal Bmp As Bitmap, ByVal Quality As Integer, ByVal Progress As ProgressBar) As OutData
      11. ' Dekomprimiert zu einer Bitmap
      12. Public Function Decompress(ByVal Data As OutData) As Bitmap
      13. Public Function Decompress(ByVal Data As OutData, ByVal Progress As ProgressBar) As Bitmap
      14. ' Speichert die komprimierten Daten, auf Wunsch mit encodierten Farben
      15. Public Sub Save(ByVal File As String, ByVal Data As OutData, ByVal Use56i5nColorCompression As Boolean)
      16. ' Lädt Daten aus einer Datei
      17. Public Function Load(ByVal File As String) As OutData


      Beispiel:

      VB.NET-Quellcode

      1. ' Vorbereiten
      2. Dim C As New nGIv2lib.nGI.Encoder
      3. C.Init()
      4. ' Komprimieren
      5. Dim Out As nGIv2lib.nGI.OutData
      6. Dim Img As Bitmap = Bitmap.FromFile("MeineBitmap.png")
      7. Out = C.Compress(Img, 50)
      8. C.Save("Komprimiert.ng2", Out, False)
      9. ' Dekomprimieren
      10. Dim Data As nGIv2lib.nGI.OutData
      11. Dim Img2 As Bitmap
      12. Data = C.Load("Komprimiert.ng2")
      13. Img2 = C.Decompress(Data)
      14. 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“ ()

      Also das Ergebnis hört sich ja ganz gut an, allerdings fehlen irgendwie noch die Möglichkeiten, wie zB. eine .dll um die Bilder in eigenen Programmen zu nutzen. Außerdem sollte das "Tool" etwas hochwertiger sein, und nicht als text "Form1" haben.

      Brainfuck-Quellcode

      1. Informationen über das Aufrufen von JIT-Debuggen
      2. anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
      3. ************** Ausnahmetext **************
      4. System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
      5. bei nGI_v2.Form1.Button2_Click(Object sender, EventArgs e)
      6. bei System.Windows.Forms.Control.OnClick(EventArgs e)
      7. bei System.Windows.Forms.Button.OnClick(EventArgs e)
      8. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
      9. bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
      10. bei System.Windows.Forms.Control.WndProc(Message& m)
      11. bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
      12. bei System.Windows.Forms.Button.WndProc(Message& m)
      13. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      14. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      15. bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      16. ************** Geladene Assemblys **************
      17. mscorlib
      18. Assembly-Version: 2.0.0.0.
      19. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      20. CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
      21. ----------------------------------------
      22. nGI v2
      23. Assembly-Version: 1.0.0.0.
      24. Win32-Version: 1.0.0.0.
      25. CodeBase: file:///C:/Dokumente%20und%20Einstellungen/Doom/Desktop/nGI%20v2.exe.
      26. ----------------------------------------
      27. Microsoft.VisualBasic
      28. Assembly-Version: 8.0.0.0.
      29. Win32-Version: 8.0.50727.3053 (netfxsp.050727-3000).
      30. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
      31. ----------------------------------------
      32. System
      33. Assembly-Version: 2.0.0.0.
      34. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      35. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll.
      36. ----------------------------------------
      37. System.Windows.Forms
      38. Assembly-Version: 2.0.0.0.
      39. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      40. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
      41. ----------------------------------------
      42. System.Drawing
      43. Assembly-Version: 2.0.0.0.
      44. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      45. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
      46. ----------------------------------------
      47. System.Runtime.Remoting
      48. Assembly-Version: 2.0.0.0.
      49. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      50. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
      51. ----------------------------------------
      52. mscorlib.resources
      53. Assembly-Version: 2.0.0.0.
      54. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      55. CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
      56. ----------------------------------------
      57. System.Windows.Forms.resources
      58. Assembly-Version: 2.0.0.0.
      59. Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
      60. CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
      61. ----------------------------------------
      62. ************** JIT-Debuggen **************
      63. Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
      64. Konfigurationsdatei der Anwendung oder des Computers
      65. (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
      66. Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.
      67. Zum Beispiel:
      68. <configuration>
      69. <system.windows.forms jitDebugging="true" />
      70. </configuration>
      71. Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
      72. Ausnahmen an den JIT-Debugger gesendet, der auf dem
      73. Computer registriert ist, und nicht in diesem Dialogfeld behandelt.



      Habe versucht ein .jpeg zu convertieren

      FlashTek schrieb:

      Also das Ergebnis hört sich ja ganz gut an, allerdings fehlen irgendwie noch die Möglichkeiten, wie zB. eine .dll um die Bilder in eigenen Programmen zu nutzen. Außerdem sollte das "Tool" etwas hochwertiger sein, und nicht als text "Form1" haben.

      Wie gesagt, das ist nichts als eine extrem simple Demo, deshalb frage ich ja, was damit jetzt passieren soll.

      @Doom: hast du vorher die Datenbank geladen (oberster Button)?

      // EDIT: Jetzt gibts ne DLL!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „niwax“ ()