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

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

詳細はこちら
C#

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1489閲覧

【iOS C#】UIImageでの文字列合成ができません

JpTomari

総合スコア4

C#

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2021/01/07 10:00

編集2021/01/08 06:40

前提

Xamarin環境下でC#を利用し、iOSアプリケーションを作成しております。

今回、透過状態のUIImage上に、文字列を合成して表示する必要が出てきました。
そこで以下のコードを組んで動作を確認したのですが、何も描画されず、白い板が表示されています。

該当のソースコード

C#

1 // 文字列生成 2 UIImage image = null; 3 4 CGSize windowSize = new CGSize(TEXT_WINDOW_X, TEXT_WINDOW_Y); 5 UIGraphics.BeginImageContextWithOptions(windowSize, false, 0); 6 7 CGContext context = UIGraphics.GetCurrentContext(); 8 9 nfloat fontSize = 64.0f; 10 NSString text = new NSString(name); 11 UIFont font = UIFont.FromName("Hiragino Kaku Gothic ProN W3", fontSize); 12 RectangleF rectF = new RectangleF(0, 0, TEXT_WINDOW_X, TEXT_WINDOW_Y); 13 14 context.SetFillColor(UIColor.Black.CGColor); 15 text.DrawString(rectF, font, UILineBreakMode.WordWrap, UITextAlignment.Left); 16 17 image = UIGraphics.GetImageFromCurrentImageContext(); 18 UIGraphics.EndImageContext();

試したこと

BeginImageContextWithOptionメソッドの第2パラメータをtrueとし、contextにFillRectを行いましたが
指定した色が表示されず、白い板のままです。

また、文字列に指定している色の値や、文字サイズなどはいくつか変更してみましたが、変化がありません。

補足情報

表示されている白い板は、指定サイズであることが確認されております。

NSStringで指定されている"name"が、表示したい任意の文字列です。
また、フォントの指定についても正しい指定がなされていることが確認できています。

実現したいこと

最終的には、文字列のみが表示されている背景透過のUIImage画像が必要となります。

何か不足な部分などあるようでしたら、どうぞご教授願います。

追記・テクスチャ登録処理

以下にテクスチャ登録処理を追記します。

C#

1 //--------------------------------------------------- 2 // ゲーム用テクスチャの生成 3 // ※イメージデータ指定版 4 //--------------------------------------------------- 5 public void InitTexture(UIImage[] image, int start, int end) 6 { 7 int i; 8 int len = image.Length; 9 10 // 配列の初期化 11 mTextureID = new int[len]; // バインド用テクスチャID配列 12 mTextureBitmap = new NSData[len]; // 画像保存用配列 13 mTextureSize = new int[len, (int)Def.XYWH]; // テクスチャサイズ保存用配列 14 15 // テクスチャのワークを生成 16 GL.GenTextures(len, mTextureID); 17 18 // ゲーム用テクスチャイメージを取得 19 for (i = start; i < end; i++) 20 { 21 if (i >= len) continue; 22 23 // ビットマップイメージを生成 24 CGDataProvider dp = image[i].CGImage.DataProvider; 25 NSData data = dp.CopyData(); 26 mTextureBitmap[i] = data; 27 28 // テクスチャサイズの取得 29 mTextureSize[i, (int)Def.X] = 0; 30 mTextureSize[i, (int)Def.Y] = (int)image[i].CGImage.Height; 31 mTextureSize[i, (int)Def.W] = (int)image[i].CGImage.Width; 32 mTextureSize[i, (int)Def.H] = (int)-image[i].CGImage.Height; 33 34 // テクスチャの登録 35 GL.BindTexture(All.Texture2D, mTextureID[i]); 36 GL.TexParameter(All.Texture2D, All.TextureMinFilter, (int)All.Nearest); 37 GL.TexParameter(All.Texture2D, All.TextureMagFilter, (int)All.Nearest); 38 GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, mTextureSize[i, (int)Def.W], -mTextureSize[i, (int)Def.H], 0, 39 (All)OpenTK.Graphics.ES11.PixelFormat.Rgba, All.UnsignedByte, data.Bytes); 40 } 41 }

ここで引数として使用している"UIImage[] image"に生成されたUIImageが格納されます。
この処理で登録したテクスチャを"GL.Oes.DrawTex"で描画する形です。

通常のpngイメージから生成されたUIImageは正常に描画されております。
何か情報に不足がありましたら、ご連絡ください。

以上、どうぞよろしくお願いいたします。

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

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

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

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

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

NakamuraYoichi

2021/01/08 04:14

私のところでは再現しませんでした。つまり、文字は書き込まれました。ViewDidLoard 内に上のコードを書き、適当な UIImageView に imageview1.Image = image; として確認しました。
JpTomari

2021/01/08 05:02

検証ありがとうございます。 表示については、ポリゴンへのテクスチャとして使用する形ですので、この部分に問題はないかもしれませんね…。 こちらでもさらに検証を進めます。
guest

回答1

0

自己解決

自己解決いたしました。

結論から言いますと、画像そのものの生成は正常に行われましたが、テクスチャに登録するためのサイズ指定に誤りがあったため、描画がされない形となっておりました。

ポリゴン用テクスチャのサイズは、2の累乗倍でなければならない原則を忘れてしまったための失敗です。

NakamuraYoichiさま、検証のご協力、誠にありがとうございました。

投稿2021/01/11 10:14

JpTomari

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問