从代码创建图像,打印时看起来像素化

created image from code, looks pixelated when printing it

我正在尝试从以编程方式创建的图像打印 40x40mm 标签。

标签上必须有文字和徽标。由于标签相当小,我发现自己正在摆弄如何进行适当的平滑处理、抗锯齿等。

我已经尝试过多种设置,但我不确定这是否是正确的方法。

首先我绘制容器位图:

private Bitmap DrawLabelCircle()
{
    var labelImage = new Bitmap(152, 152);

    using (Graphics gfx = Graphics.FromImage(labelImage))
    {
        var pen = new Pen(Color.Black, 1);
        gfx.SmoothingMode = SmoothingMode.AntiAlias;
        gfx.DrawEllipse(pen, 1, 1, 150, 150);
    }

    return labelImage;
}

然后我在该容器位图上叠加不同的文本片段

private Bitmap DrawDistributorTextRectangle(string text)
{
    var bitmap = new Bitmap(113, 113);

    var rectangle = new Rectangle(0, 0, 110, 110);

    using (Graphics gfx = Graphics.FromImage(bitmap))
    {
        gfx.SmoothingMode = SmoothingMode.AntiAlias;
        gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gfx.PixelOffsetMode = PixelOffsetMode.HighQuality;

        var font = new Font(FontFamily.GenericSansSerif, 5, FontStyle.Regular, GraphicsUnit.Point);
        var brush = new SolidBrush(Color.Black);

        gfx.TextRenderingHint = TextRenderingHint.AntiAlias;
        gfx.DrawString(text, font, brush, rectangle);
    }

    bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);

    return bitmap;
}

将该文本覆盖在之前创建的位图上。

private Bitmap DistributorTextOverlay(Bitmap source, Bitmap overlay)
{
    var result = new Bitmap(source.Width, source.Height);

    var graphics = Graphics.FromImage(result);
    graphics.CompositingMode = CompositingMode.SourceOver;
    graphics.SmoothingMode = SmoothingMode.HighQuality;

    graphics.DrawImage(source, 0, 0);
    graphics.DrawImage(overlay, 120, 0);

    return result;
}

然后我保存它。

var imageCodecInfo = ImageCodecInfo.GetImageEncoders().First(encoder => encoder.MimeType == "image/png");

var encoderInfo = new EncoderParameters() { Param = { [0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L) } };

image.SetResolution(203, 203);
image.Save("img.png", imageCodecInfo, encoderInfo);

这里最大的挑战是我得到的图像实际上看起来还不错,考虑了所有因素。

但是当我打印它时,它看起来像素化得很糟糕。

我真的很想就在保存最终结果之前我应该​​对所有这些位图应用什么设置,以及我保存的最终图像应该应用什么设置提供一些指导。

我绝不是 .NET 图形专家,因此非常感谢所有帮助。

40 毫米是 1.5748 英寸。因此,如果您计划以 300 dpi 分辨率打印它,您的位图应为 1.5748*300 = 472 像素而不是 152.