2

素晴らしい質問があります。すべてのGoogleとMSDNを検索しましたが、何も見つかりませんでした。

フォントを文字ごとに1つのPNG画像にエクスポートするプログラムを実行しようとしています。現在、新しいWindowsフォントであるSegoeUISymbolを使用してテストしています。私はフォントのライセンス条項を知っており、そのフォントをインターネットで配布しないことに注意してください。

DrawStringさて、本当の問題は、のメンバーであるメソッドを呼び出すときに発生していますGraphics。Unicode整数値を文字に変換してから文字列に変換します。私はすでに整数をcharに変換しようとchar.ConvertFromUtf32()しましConvert.ToChar()た。

プログラムは26文字(57344 = 0xE000から開始)で正常に動作しています。57370まで数値を使用しても問題は発生しません。この後、白いボックス文字で書かれていない数字は1つもありません。

いくつか検索した後Font、属性を持つコンストラクターへのオーバーロードを見つけ、gdiCharsetその値を2として使用しようとしましたが、何も起こりませんでした。

以下にソースコードを示します。どうか、助けてくれる人がいれば嬉しいです。

UPDATE エスケープシーケンスを使用すると("\uE1FF"char変換の代わりに機能します!しかし、forループ内でエスケープシーケンスを作成する方法がわかりません。

        Font segoe = new Font("Segoe UI Symbol", 800, FontStyle.Regular, GraphicsUnit.Pixel, 2);

        Bitmap bmedidor = new Bitmap(1000, 1000, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        Graphics gmedidor = Graphics.FromImage(bmedidor);
        // This line below doesn't matter, see the method DrawString
        Size tamanho = gmedidor.MeasureString(char.ConvertFromUtf32(57344).ToString(), segoe).ToSize();

        int[] reducoes = new int[6] {512, 256, 128, 64, 32, 16};
        string caminho = "C:\\InoMetro";


        for (int u = 57344; u < 57896; u++)
        {
            Bitmap caractere = new Bitmap(tamanho.Width, tamanho.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics criador = Graphics.FromImage(caractere);

            criador.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            criador.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            criador.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            criador.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            // Here we have the problem
            criador.DrawString(Convert.ToChar(u).ToString(), segoe, new SolidBrush(Color.Black), new PointF(0, 0));

            for (int r = 0; r < reducoes.Length; r++)
            {
                int taR = reducoes[r];

                Bitmap reducao = new Bitmap(taR, taR, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                Graphics redutor = Graphics.FromImage(reducao);

                redutor.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                redutor.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                redutor.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                redutor.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

                redutor.DrawImage(caractere, 0, 0, taR, taR);
                reducao.Save(caminho + "\\" + taR.ToString() + "\\" + u.ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png);

            }

        }
4

1 に答える 1

4

U + E000-U + F8FF(10進数の57344-63743)は私用面の文字です。

ほとんどのフォント(Segoe UIシンボルを含む)は、この範囲のコードポイントにグリフを提供しないため、一般的なフォールバック動作は、フォントレンダラーが白いボックス()または疑問符を黒いひし形(�)で表示することです。これらのコードポイントの1つを描画するように求められたとき。

Windows8のSegoeUIシンボルは、U + E000-U + E019のグリフのみを定義し、U + E01A-U+E051のグリフを提供しません。そのため、57370(0xE01A)から57425(0xE051)の白いボックスが表示されます。

于 2012-06-21T04:53:49.930 に答える