2017-06-24 59 views
2

ギャラリーから読み込んだQR画像をデコードできるようにするには、画像を読み込んでtexture2Dとして読み込むプラグインを見つけましたが、そのQRコードをデコードするにはTexture2D読み込み/書き込みが可能でなければなりません。プラグインを確認しました。アンドロイドの場合は、jarを使って探検と読み込みを行います。IOSプラットフォームではパッケージライブラリを使用しているため、libのコードにアクセスできません。Texture2Dをスクリプトで読み込む方法

私は答えを探しましたが、ほとんどの解決策はUnityインスペクタのテクスチャのインポート設定を変更することでしたが、これはコードによってロードされたテクスチャなので、インスペクタの設定は利用できませんので、私の質問は

Iこの読み込まれたテクスチャをコードで読み書き可能にする方法はありますか? libコードにアクセスする必要はありませんか?

おかげ

は、ここで私はthis answerを試みたが、運を持っていない、あなたが見ることができるように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)); 
} 

により質感を得ることができるコードです。

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] 

:ここ

とは、Androidで示したエラーであるソースTexture2Dは、プラグインから来ている

、私はから有効読み取り/書き込みにそれを設定することはできませんエディタのTextureImporter.isReadable変数を使用します。

.USE RenderTexture(推奨):

使用RenderTexture

+0

ここで、読み取りエラーが発生していますか?コード行を投稿してください。 – Programmer

+0

@Programmer、もう一度見てよかったです。ログを投稿するように編集しました – armnotstrong

+0

あなたの質問をもう一度読み、古いものを削除することにしました。私が使用した 'Texture2D.LoadImage'関数である重要な行がありませんでした。今はすべてが良ければ教えてください。 – Programmer

答えて

4

はこれを行うには2つの方法があります。情報源Texture2DRenderTextureGraphics.Blitと入力し、次にTexture2D.ReadPixelsを使用してRenderTextureの画像を新しい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; 
} 

使用

Texture2D copy = duplicateTexture(sourceTextFromPlugin); 

これは動作するはずですし、任意のエラーをスローしてはいけません。


.USE + Texture2D.LoadRawTextureData()Texture2D.GetRawTextureData()

Texture2Dが読めないので、あなたはGetPixels32()を使用することはできません。あなたはGetRawTextureData()を使用することに非常に近いです。

Texture2D.LoadImage()を使用してGetRawTextureData()からロードすると失敗しました。

Texture2D.LoadImage()は、Texture2D配列バイトではなくPNG/JPG配列バイトをロードするために使用されます。

Texture2D.GetRawTextureData()とお読みになる場合は、Texture2D.LoadRawTextureData()ではなく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; 
} 

上記のコードではエディタにエラーはありませんが、スタンドアロンビルドではエラーが発生するはずです。しかも、スタンドアロンビルドのエラーでもまだ動作するはずです。私はエラーが警告のようなものだと思う。

エラーを投げないので、#1の方法を使用することをお勧めします。

+0

こんにちは。 '06-24 16:27:31.295:E/Unity(19300):' byte [] [pix] = source.GetRawTextureDataの行でプレーヤーの 'GetRawTextureDataにエラーが出るようにテクスチャを読み書きする必要があります。 (); ' – armnotstrong

+0

更新された回答を確認してください。あなたは私の答えをもう一度読まなければならないと思います。エラーが発生しないように#1を使用してください。 – Programmer

+0

こんにちは、@プログラマー、最初の方法を試して私がベッドから起きた最初のものだった:Dとそれは動作します!私の一日を節約してくれてありがとう...再び!そしてUnityのtexture2Dの仕組みを理解することは非常に難しく、この種の問題で少なくとも2回、特に読み書き用のものについて苦労しています。 :Dありがとう!ありがとう! – armnotstrong

関連する問題