Verwenden von Dateien vom Typ WebP in Unity

Einführung

WebP ist ein von Google entwickeltes Bildformat, das insbesondere für die Bildübertragung im Web eine höhere Komprimierungseffizienz und eine bessere Bildqualität bietet. Hier sind einige wichtige Funktionen:

Komprimierungseffizienz: WebP bietet im Allgemeinen eine bessere Komprimierungseffizienz als JPEG, insbesondere bei Bildern mit vielen Farben.

Transparenzunterstützung: WebP unterstützt verlustbehaftete und verlustfreie Komprimierung und kann die Transparenz bei verlustbehafteter Komprimierung bewahren. Dies ist ein Vorteil gegenüber JPEG, das keine Transparenz unterstützt.

Dynamische Bilder: Das WebP-Format unterstützt auch dynamische Bilder, ähnlich wie GIF. Dadurch eignet es sich für die Darstellung einfacher Animationen.

Farbkonfiguration: WebP unterstützt mehrere Farbkonfigurationen, einschließlich Graustufen, Farbe und Transparenz.

Unterstützt verlustbehaftet und verlustfrei: WebP kann sowohl verlustbehaftete als auch verlustfreie Komprimierungsmodi verwenden. Der verlustfreie Modus bewahrt die Bildqualität, während der verlustbehaftete Modus eine höhere Komprimierung bietet, jedoch möglicherweise zu geringfügigen visuellen Verlusten führt.

Schnelle Dekodierung: WebP-Bilder können in relativ kurzer Zeit dekodiert werden, was für ein schnelles Laden auf Webseiten wichtig ist.

WebP wird bereits von vielen modernen Webbrowsern unterstützt, darunter Google Chrome, Mozilla Firefox, Microsoft Edge und anderen. Da jedoch nicht jede Bildbearbeitungssoftware WebP unterstützt, sind manchmal Konvertierungstools erforderlich, um Bilder in diesem Format zu verarbeiten.

Verwendung von WebP-Dateien in Unity

Unity unterstützt das WebP-Format standardmäßig nicht, daher müssen wir die Daten konvertieren, nachdem wir sie erhalten haben.

Github bietet einige Open-Source-Lösungen, wie zum Beispiel:

Sie können den Quellcode auch aus der Open-Source-Bibliothek libwebp von Google herunterladen und in ein Plug-in für die entsprechende Plattform kompilieren.

Die Anforderungen des Autors bestehen darin, die Spieler-Avatare jeder Live-Übertragungsplattform in einer Windows-Umgebung abzurufen (die TK-Plattform liegt im WebP-Format vor) und sie auf der Benutzeroberfläche anzuzeigen. Daher ist es notwendig, festzustellen, ob der Avatar im WebP-Format vorliegt, und ihn dann in eine von Unity unterstützte Textur zu konvertieren.

Überprüfung des WebP-Formats

Die ersten 12 Bytes der WebP-Formatdatei sind eine feste Identifikationsbytesequenz. Die ersten 4 Bytes sind „RIFF“, 5–8 Bytes geben die Dateigröße an (in Little-Endian), die letzten 4 Bytes geben den Dateityp an, WebP-Bilder sind „WEBP“.
RIFF ist die Abkürzung für Resource Interchange File Format und eine universelle Dateiformatkennung.

Microsoft verwendet das RIFF-Format als Grundlage für zwei bekannte Dateiformate, AVI und WAV.

RIFF-Dateien bestehen aus einem einfachen Header, gefolgt von mehreren „Blöcken“. Sein Format ist genau das gleiche wie IFF, außer dass die Speichermethode für Ganzzahlen unterschiedlich ist.

  • Header
    • 4 Bytes: auf „RIFF“ festgelegt.
    • 4-Bit-Gruppe: positive 32-Bit-Little-Endian-Ganzzahl, die Größe der gesamten Datei, ohne Identifikationszeichen und Länge, insgesamt 8 Bytes.
    • 4-Bit-Gruppe: Das Typzeichen dieser Datei, zum Beispiel: „AVI“ oder „WAVE“.
  • Als nächstes folgen Chunks. Jeder Chunk enthält:
    • 4-Bit-Gruppe: ASCII-Identifikationswort dieses Blocks, zum Beispiel: „fmt“ oder „data“.
    • 4-Bit-Gruppe: positive 32-Bit-Little-Endian-Ganzzahl, die die Länge dieses Blocks angibt (diese positive Ganzzahl selbst und die Länge des Blockidentifikationsworts sind nicht enthalten).
    • Feld mit nicht fester Länge: Die Daten dieses Blocks haben eine Größe, die der positiven Ganzzahl in der vorherigen Spalte entspricht.
    • Wenn die Länge des Blocks keine gerade Zahl ist, geben Sie ein Byte ein.

Für unser Projekt habe ich hier nur die RIFF- und WEBP-Logos überprüft. Der Code lautet wie folgt:

    public static bool IsWebP(byte[] imageData)
    {
    
    
        if (imageData.Length<12)
        {
    
    
            return false;
        }
        // WebP文件头的标识字节序列
        byte[] webpHeader = {
    
     0x52, 0x49, 0x46, 0x46 };//R对应的ASCII码用16进制表示为 0x52 ,当然也可以使用十进制 82,或者二进制 0b1010010 (使用二进制需要使用0b前缀来标识)

        // 检查前4个字节是否匹配WebP头部
        for (int i = 0; i < webpHeader.Length; i++)
        {
    
    
            if (imageData.Length <= i || imageData[i] != webpHeader[i])
            {
    
    
                return false;
            }
        }

        // 提取文件大小(little-endian)
        int fileSize = BitConverter.ToInt32(imageData, 4);//fileSize+8==imageData.Length

        // 文件类型标识符 "WEBP"
        byte[] webpIdentifier = {
    
     0x57, 0x45, 0x42, 0x50 };

        // 检查文件类型标识符
        for (int i = 8; i < 12; i++)
        {
    
    
            if (imageData.Length <= i || imageData[i] != webpIdentifier[i - 8])
            {
    
    
                return false;
            }
        }        
        return true;
    }

In Textur umwandeln

Der Autor hat das oben erwähnte webp-unity3d verwendet . Lesen und konvertieren Sie WebP-Bilder reibungslos im Editor. Es ist zu beachten, dass die vom Autor über CreateTexture2DFromWebP erhaltene Texture2D nicht lesbar ist. Sie können in dieser Methode Parameter hinzufügen. Wenn Apply ITexture2D generiert, können die Parameter extern frei festgelegt werden.

andere

Offizielle technische Dokumentation

Nachwort

Der obige webp-unity3d meldet nach dem Packen einen Fehler:

DllNotFoundException: Unable to load DLL 'webp'. Tried the load the following dynamic libraries: Unable to load dynamic library 'webp' because of 'Failed to open the requested dynamic library (0x06000000) - 找不到指定的模块。  (WinError:0000007e)
  at WebP.Extern.NativeBindings.WebPGetInfo (System.IntPtr data, System.UIntPtr data_size, System.Int32& width, System.Int32& height) [0x00000] in <00000000000000000000000000000000>:0 
  at WebP.Texture2DExt.CreateTexture2DFromWebP (System.Byte[] lData, System.Boolean lMipmaps, System.Boolean lLinear, System.Boolean resultTextureReadable, WebP.Status& lError, WebP.Texture2DExt+ScalingFunction scalingFunction) [0x00000] in <00000000000000000000000000000000>:0 
  at UnityWebRequestMgr+<_GetTexture>d__10.MoveNext () [0x00000] in <00000000000000000000000000000000>:0 
  at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00000] in <00000000000000000000000000000000>:0

Wechseln Sie zu „unity.webp“ und die Anforderungen werden in der PC-Umgebung umgesetzt (andere Plattformen wurden nicht getestet).

Supongo que te gusta

Origin blog.csdn.net/iningwei/article/details/134061118
Recomendado
Clasificación