1

文字列に基づいて画像を作成しようとしています。画像はラスターである必要があります(そうでない場合、ズームアウトする必要がある場合は解像度が失われます)。私は次のコードを使用しています:

Bitmap bitmapimage = new Bitmap(200, 100);
Graphics bitmapGraphics = Graphics.FromImage(bitmapimage );   
bitmapGraphics .DrawString("test", new Font("Arial",50), Brushes.Black, new Point(0, 0));              
bitmapimage .Save("Image.png", System.Drawing.Imaging.ImageFormat.png);
textPictureBox.Image = bitmapimage ;

私が得るのはこのような画像です(ズーム後):

テスト画像

どうしてこれなの?

4

3 に答える 3

3

「ラスター」の意味を誤解していると思います。ラスター イメージはグリッドであり、各グリッド位置に 1 つのピクセルがあります。ラスター イメージを十分にズームすると、アンチエイリアシングなどの手法を使用しても、グリッドがはっきりと見えるようになります。

一方、ベクターグラフィックスはアルゴリズムベースです。特定のキャンバスで画像を再現する方法に関する指示が保存されます。ベクトル画像をズームすると、以前のレンダリングを単純にスケーリングするのではなく、指示に従っているため、画像はシャープなままです。

主な画像タイプ (bmp、gif、png、jpeg) はすべてラスター タイプであり、ベクター グラフィックスはサポートされていません。png画像はあなたの例ラスタ化されています...実際、ラスタ化されていないpng画像を作成することは不可能です。ベクター画像の例は、特定のフォント タイプまたは Photoshop (psd) ファイルです (実際には、Photoshop ファイルは最終的にベクターよりもラスターになる傾向があります)。

この場合、おそらく最も簡単な解決策は、最初に画像を非常に大きく描画することです...ズームインする必要がないほど十分に大きく、スペースを埋めるのに十分な大きさのフォントを使用します。また、完全にベクター描画されたフォントを使用していることを確認する必要があります。

于 2013-01-15T17:25:49.243 に答える
2

Vector Basic グラフィックスを使用してみてください。これを使用すると、ズームインまたはズームアウトしても問題は発生しません。

o C# のベクター グラフィックス (MSDN)

oサンプル プロジェクト (MSDN)

于 2013-01-15T17:22:36.247 に答える
1

ベクターグラフィックスはスケーラブルですが、ラスターはスケーラブルではありません。
テキスト フォントはスケーラブルですが (ビットマップ フォントを使用しない限り)、ビットマップ上に文字列を描画すると、このテキストはラスター イメージになるため、それ以上スケーリングすることはできません。したがって、ビットマップ上にテキストを描画する必要がある場合は、大きな画像を使用し、アンチエイリアス処理されたテキストを使用してみてください (この画像も拡大縮小できませんが、十分に大きい場合は拡大する必要はありません)。


コードの修正版を次に示します (テキストは PNG 画像と同じ大きさになります)。

以下を追加しますusing

using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Drawing.Text;

次の行をフォームに (プライベート クラス フィールドとして) 追加します。

        Random rnd = new Random();

コードの残りの部分:

        int scl = rnd.Next(100, 451);
        Bitmap bitmapimage = new Bitmap(2 * scl, scl);
        Graphics bitmapGraphics = Graphics.FromImage(bitmapimage);
        bitmapGraphics.CompositingMode = CompositingMode.SourceOver;
        bitmapGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;  // text is now anti-aliased
        bitmapGraphics.SmoothingMode = SmoothingMode.HighQuality;
        bitmapGraphics.DrawString("test", new Font("Arial", scl * 9 / 10, GraphicsUnit.Pixel), Brushes.Black, new Point(0, 0));
        bitmapimage.Save("Image.png", ImageFormat.Png);
        bitmapGraphics.Dispose();

ところで、プリンターの Graphics オブジェクトにテキストを描画する場合、プリンターはピクセルを使用しないため、このテキストはスケーラブルです (ただし、プリンターの Graphics オブジェクトにラスター イメージを描画する場合、このイメージを拡大するとぼやけてしまいます)。 .

于 2013-01-15T19:08:22.033 に答える