🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1605閲覧

UnityでSpriteの色がある部分の解析をしたい

momiji0210

総合スコア60

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/02/18 04:23

UnityでCanvasUIで生成しているImageの解析をしています。

1ドットずつ参照して、色がある部分の取得まではできたのですが
上下がおそらく反転されてしまっております。

テクスチャの仕様をよく理解できていないのかもですが、
正常に出力する方法はないでしょうか。

配列を反転すればそれっぽいものができそうなのですが、
何故こうなるのか理解できていないため、アドバイス頂けないでしょうか。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6/* 7UI-Imageを配置、配置したものにSpriteを設定 8UnityException: Texture '*******' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings. 9・「Texture Type」を「Advanced」に 10・「Read/Write Enabled」にチェックを入れる 11・「Apply」を押して変更を適用 12*/ 13 14public class DotsaAlysis : MonoBehaviour { 15 16 public Image imageDots; 17 18 // Start is called before the first frame update 19 void Start() { 20 21 Texture2D texture = imageDots.sprite.texture; 22 Color[] inputColors = texture.GetPixels(); 23 24 string text = ""; 25 26 for (int y = 0; y < texture.height; y++) { 27 for (int x = 0; x < texture.width; x++){ 28 var color = inputColors[(texture.width * y) + x]; 29 // 画像がなければ0,あれば1 30 if(color.a == 0){ 31 text += "0"; 32 } else { 33 text += "1"; 34 } 35 if(x != texture.width-1) text += ","; 36 } 37 if(y != texture.height-1) text += "\n"; 38 } 39 Debug.Log(text); 40 } 41 42}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リファレンスによると、GetPixelsで得られるデータは...

The returned array is a flattened 2D array, where pixels are laid out left to right, bottom to top (i.e. row after row).

とのことで、起点は左下になっています。ですので配列上のデータを若いインデックスから順にテキスト化していくと、それをたとえばテキストエディタで開いてみたときに上下が逆転して見えるのは正常な挙動かと思います。
これだと解析する上で都合が悪いようでしたら、おっしゃるように配列を加工するか、あるいは文字列化するときに行を逆順に走査するのがいいんじゃないでしょうか。

C#

1 for (int y = texture.height - 1; y >= 0; y--) { 2 for (int x = 0; x < texture.width; x++){ 3 var color = inputColors[(texture.width * y) + x]; 4 // 画像がなければ0,あれば1 5 if(color.a == 0){ 6 text += "0"; 7 } else { 8 text += "1"; 9 } 10 if(x != texture.width-1) text += ","; 11 } 12 if(y != 0) text += "\n"; 13 }

投稿2021/02/18 10:37

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momiji0210

2021/02/18 12:41

ありがとうございます!そういうことだったのですね。 回避方法も助かります。反対から見るのが良さそうですね!勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問