unity texture setpixel script getpixels create c# unity3d texture2d

c# - setpixel - Cómo hacer que Texture2D sea legible a través de un script



unity create texture2d script (1)

Quiero que el usuario pueda decodificar la imagen QR cargada desde la galería, he encontrado un complemento para explorar y cargar la imagen como texture2D, pero para decodificar ese código QR, Texture2D tiene que ser legible / escribible, y compruebo el complemento, para Android está explorando y cargando cosas con un jar y en la plataforma IOS está usando una biblioteca empaquetada, por lo que no tengo acceso al código de la biblioteca,

He buscado la respuesta, la mayor solución fue cambiar la configuración de importación de textura en el inspector de Unity, pero como esta es una textura cargada por código, no hay una configuración de inspector disponible para eso, así que mi pregunta es:

¿Hay alguna manera de hacer que esta textura cargada sea leída / escribible por código? sin tener que acceder al código lib?

Gracias

Aquí está el código que podría obtener la textura de este complemento

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)); }

Como puede ver, he intentado esta respuesta, pero no tuve suerte.

Y aquí está el error que mostró Android:

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]

Nota :

La fuente Texture2D proviene de un complemento, no puedo configurarlo para Lectura / Escritura Habilitado desde el Editor o usar la variable TextureImporter.isReadable del Editor.


Hay dos maneras de hacer esto:

1.Utilice RenderTexture (recomendado):

Use RenderTexture . Coloque el Texture2D origen en RenderTexture con Graphics.Blit luego use Texture2D.ReadPixels para leer la imagen de RenderTexture en el nuevo Texture2D .

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; }

Uso :

Texture2D copy = duplicateTexture(sourceTextFromPlugin);

Esto debería funcionar y no debería arrojar ningún error.

2.Utilice Texture2D.GetRawTextureData() + Texture2D.LoadRawTextureData() :

No puede usar GetPixels32() porque Texture2D no es legible. Estabas tan cerca de usar GetRawTextureData() .

Falló cuando utilizó Texture2D.LoadImage() para cargar desde GetRawTextureData() .

Texture2D.LoadImage() solo se usa para cargar bytes de matriz PNG / JPG, no byte de matriz Texture2D.

Si lee con Texture2D.GetRawTextureData() , debe escribir con Texture2D.LoadRawTextureData() no Texture2D.LoadImage() .

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; }

No habrá ningún error con el código anterior en el Editor, pero debería haber un error en la compilación independiente. Además, aún debería funcionar incluso con el error en la compilación independiente. Creo que ese error es más como una advertencia.

Le recomiendo que use el método # 1 para hacer esto, ya que no arrojará ningún error.