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

我认为您误解了“光栅”的含义。光栅图像是网格,每个网格位置有一个像素。当您将光栅图像放大到足够远时,即使使用抗锯齿等技术,网格也会变得清晰可见。

另一方面,矢量图形是基于算法的。它们存储有关如何在给定画布上再现图像的说明。当您缩放矢量图像时,图像将保持清晰,因为它仍然遵循指令,而不是简单地缩放先前的渲染。

所有主要的图像类型(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 回答