从代码创建图像,打印时看起来像素化
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.
我正在尝试从以编程方式创建的图像打印 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.