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.