質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.34%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 147

JpTomari

score 2

前提

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

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

該当のソースコード

    // 文字列生成
    UIImage image = null;

    CGSize windowSize = new CGSize(TEXT_WINDOW_X, TEXT_WINDOW_Y);
    UIGraphics.BeginImageContextWithOptions(windowSize, false, 0);

    CGContext context = UIGraphics.GetCurrentContext();

    nfloat fontSize = 64.0f;
    NSString text = new NSString(name);
    UIFont font = UIFont.FromName("Hiragino Kaku Gothic ProN W3", fontSize);
    RectangleF rectF = new RectangleF(0, 0, TEXT_WINDOW_X, TEXT_WINDOW_Y);

    context.SetFillColor(UIColor.Black.CGColor);
    text.DrawString(rectF, font, UILineBreakMode.WordWrap, UITextAlignment.Left);

    image = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();

試したこと

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

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

補足情報

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

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

実現したいこと

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

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

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

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

    //---------------------------------------------------
    // ゲーム用テクスチャの生成
    // ※イメージデータ指定版
    //---------------------------------------------------
    public void InitTexture(UIImage[] image, int start, int end)
    {
        int i;
        int len = image.Length;

        // 配列の初期化
        mTextureID = new int[len];                        // バインド用テクスチャID配列
        mTextureBitmap = new NSData[len];                // 画像保存用配列
        mTextureSize = new int[len, (int)Def.XYWH];        // テクスチャサイズ保存用配列

        // テクスチャのワークを生成
        GL.GenTextures(len, mTextureID);

        // ゲーム用テクスチャイメージを取得
        for (i = start; i < end; i++)
        {
            if (i >= len) continue;

            // ビットマップイメージを生成
            CGDataProvider dp = image[i].CGImage.DataProvider;
            NSData data = dp.CopyData();
            mTextureBitmap[i] = data;

            // テクスチャサイズの取得
            mTextureSize[i, (int)Def.X] = 0;
            mTextureSize[i, (int)Def.Y] = (int)image[i].CGImage.Height;
            mTextureSize[i, (int)Def.W] = (int)image[i].CGImage.Width;
            mTextureSize[i, (int)Def.H] = (int)-image[i].CGImage.Height;

            // テクスチャの登録
            GL.BindTexture(All.Texture2D, mTextureID[i]);
            GL.TexParameter(All.Texture2D, All.TextureMinFilter, (int)All.Nearest);
            GL.TexParameter(All.Texture2D, All.TextureMagFilter, (int)All.Nearest);
            GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, mTextureSize[i, (int)Def.W], -mTextureSize[i, (int)Def.H], 0,
                 (All)OpenTK.Graphics.ES11.PixelFormat.Rgba, All.UnsignedByte, data.Bytes);
        }
    }


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • NakamuraYoichi

    2021/01/08 13:14

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

    キャンセル

  • JpTomari

    2021/01/08 14:02

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

    キャンセル

回答 1

check解決した方法

0

自己解決いたしました。

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る