2017-06-24 2 views
2

Ich möchte den Benutzer in die Lage versetzen, das aus der Galerie geladene QR-Bild zu entschlüsseln. Ich habe ein Plugin gefunden, um das Bild als texture2D zu laden und zu entschlüsseln, aber den Text zu entschlüsseln muss lesbar/schreibbar sein, und ich habe das Plugin überprüft, für Android macht es das Erforschen und Laden von Sachen mit einem Jar und in der IOS-Plattform benutzt es eine gepackte Bibliothek, also habe ich keinen Zugriff auf den Code der lib,Wie man Texture2D über Skript lesbar macht

Ich habe nach der Antwort gesucht, die beste Lösung war, die importierende Einstellung der Textur im Unity-Inspektor zu ändern, aber da dies eine Textur ist, die durch Code geladen wird, gibt es keine Inspector-Einstellung dafür. Also lautet meine Frage:

I Gibt es eine Möglichkeit, diese geladene Textur durch Code les- und schreibbar zu machen? ohne auf den lib-Code zugreifen zu müssen?

Dank

Hier ist der Code, der die Textur von this plugin

void OnImageLoad(string imgPath, Texture2D tex, ImageAndVideoPicker.ImageOrientation imgOrientation) 
{ 
    Debug.Log("Image Location : " + imgPath); 
    Debug.Log("Image Loaded : " + imgPath); 
    texture = tex; 
    Texture2D readableText = new Texture2D(tex.width, tex.height); 
    readableText.LoadImage(tex.GetRawTextureData()); 

    string url = QRCodeDecodeController.DecodeByStaticPic(readableText); 
    StartCoroutine(GetSceneAndLoadLevel(url)); 
} 

Wie Sie zu sehen bekommen konnte, ich habe this answer versucht, bekam aber kein Glück.

Und hier ist der Fehler, der durch Android zeigte:

06-23 21:47:32.853: I/Unity(10557): (Filename: D Line: 0) 
06-23 21:47:33.784: E/Unity(10557): Texture needs to be marked as Read/Write to be able to GetRawTextureData in player 
06-23 21:47:33.784: E/Unity(10557): UnityEngine.Texture2D:GetRawTextureData() 
06-23 21:47:33.784: E/Unity(10557): TestQR:OnImageLoad(String, Texture2D, ImageOrientation) (at D:\Unity Projects\nnkp\Assets\Scripts\QR\TestQR.cs:123) 
06-23 21:47:33.784: E/Unity(10557): <LoadImage>c__Iterator0:MoveNext() 
06-23 21:47:33.784: E/Unity(10557): UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at /Users/builduser/buildslave/unity/build/Runtime/Export/Coroutines.cs:17) 
06-23 21:47:33.784: E/Unity(10557): [./artifacts/generated/common/runtime/TextureBindings.gen.cpp line 512] 

Hinweis:

Die Quelle Texture2D aus einem Plugin kommt, ich kann es nicht einstellen/Lesen von Aktiviert schreiben der Editor oder verwenden Sie die TextureImporter.isReadable Variable des Editors.

+0

Woher bekommen Sie den Lesefehler? Veröffentlichen Sie die Codezeile. – Programmer

+0

@Programmer, schön, dich wieder zu sehen, Habe gerade bearbeitet, um das Protokoll zu posten – armnotstrong

+0

Lies deine Frage noch einmal und entschied, das alte zu löschen. Ich habe dort eine wichtige Zeile verpasst, die die von Ihnen verwendete 'Texture2D.LoadImage'-Funktion ist. Lass mich wissen, ob alles in Ordnung ist. – Programmer

Antwort

4

Es gibt zwei Möglichkeiten, dies zu tun:

.Verwendung RenderTexture (empfohlen):

Verwendung RenderTexture. Setzen Sie die Quelle Texture2D in RenderTexture mit Graphics.Blit dann verwenden Sie Texture2D.ReadPixels, um das Bild von RenderTexture in die neue Texture2D zu lesen.

Texture2D duplicateTexture(Texture2D source) 
{ 
    RenderTexture renderTex = RenderTexture.GetTemporary(
       source.width, 
       source.height, 
       0, 
       RenderTextureFormat.Default, 
       RenderTextureReadWrite.Linear); 

    Graphics.Blit(source, renderTex); 
    RenderTexture previous = RenderTexture.active; 
    RenderTexture.active = renderTex; 
    Texture2D readableText = new Texture2D(source.width, source.height); 
    readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0); 
    readableText.Apply(); 
    RenderTexture.active = previous; 
    RenderTexture.ReleaseTemporary(renderTex); 
    return readableText; 
} 

Nutzungs:

Texture2D copy = duplicateTexture(sourceTextFromPlugin); 

Dies sollte funktionieren und sollte keine Fehler werfen.


.Verwendung Texture2D.GetRawTextureData() + Texture2D.LoadRawTextureData():

Sie können nicht GetPixels32() verwenden, da die Texture2D nicht lesbar ist. Sie waren so nah dran, GetRawTextureData() zu verwenden.

Sie sind fehlgeschlagen, wenn Sie Texture2D.LoadImage() zum Laden von GetRawTextureData() verwendet haben.

Texture2D.LoadImage() ist nur verwendet PNG/JPG-Array-Bytes nicht Texture2D Array Byte zu laden.

Wenn Sie mit Texture2D.GetRawTextureData() lesen, müssen Sie mit Texture2D.LoadRawTextureData() nicht Texture2D.LoadImage() schreiben.

Texture2D duplicateTexture(Texture2D source) 
{ 
    byte[] pix = source.GetRawTextureData(); 
    Texture2D readableText = new Texture2D(source.width, source.height, source.format, false); 
    readableText.LoadRawTextureData(pix); 
    readableText.Apply(); 
    return readableText; 
} 

Es wird keinen Fehler mit dem obigen Code im Editor geben, aber im Standalone Build sollte ein Fehler auftreten. Außerdem sollte es auch mit dem Fehler im Standalone-Build noch funktionieren. Ich denke, dass dieser Fehler mehr wie eine Warnung ist.

Ich empfehle Ihnen, Methode # 1 dies zu tun, da es keinen Fehler werfen wird.

+0

Hallo. habe noch '06-24 16: 27: 31.295: E/Unity (19300): Texture muss als Read/Write markiert sein um GetRawTextureData im player' Fehler mit der Zeile von' byte [] pix = source.GetRawTextureData(); ' – armnotstrong

+0

Überprüfen Sie meine aktualisierte Antwort. Ich denke, du solltest meine Antwort noch einmal lesen. Verwenden Sie # 1, damit Sie keinen Fehler erhalten. – Programmer

+0

Hallo, @Programmer, versuchte die erste Methode war das erste, was ich vom Bett aufstand: D und es funktioniert! Danke für die Rettung meines Tages ... Wieder! Und ich fand es sehr schwer, den Mechanismus von Unity's texture2D zu verstehen, habe mindestens zwei Mal um diese Art von Problemen gekämpft, vor allem über das Lese-/Schreibkram, wenn ich dann bitten könnte, mir mehr Material zum Nachlesen zu geben? : D danke! Vielen Dank! – armnotstrong