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

时间:2018-03-27 07:13:19

标签: c# .net printing graphics gdi+

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

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

我尝试过多次设置,但我不确定这是否正确。

首先我绘制容器Bitmap:

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;
}

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

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图形专家,所以非常感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

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