我想通过名为Zebra ZXP 3的打印机打印在C#中生成的图像。 本打印机配有86mm x 54 mm卡,打印速度为300 DPI。
我以这种方式生成图像(徽章高度是以mm为单位从数据库获取,然后以私有方式转换为像素,所以我写下这些变量的值以下。)
badgeWidth = 1016 badgeHeight = 638
var bitmap = new Bitmap(badgeWidth, badgeHeight);
bitmap.SetResolution(300, 300);
SetBackgroundColor(badgeTemplateData, bitmap);
然后我有几种方法在位图上绘制一些东西(某些方法生成图片,一些文本,一些条形码等)。
private void SetStringElement(string value, Bitmap bitmap, BadgeElement element)
{
var left = element.Coordinates.Left;
var top = element.Coordinates.Top;
var fontSize = element.ElementStyle.TextSize;
var textColor = new SolidBrush(element.ElementStyle.TextColor);
var font = new Font("Arial", fontSize);
using (Graphics graphic = Graphics.FromImage(bitmap))
{
graphic.DrawString(value, font, textColor, left, top);
}
}
最后,我有将此图像转换为Base64的方法:
//This is class which generate Image (look above):
var imageGenerator = new ImageGenerator(badgeTemplate);
var badgeTemplateBitmap = imageGenerator.MapBadgeTemplateToPng(badgeSide);
var memoryStream = new MemoryStream();
badgeTemplateBitmap.Save(memoryStream, ImageFormat.Png);
var byteImage = memoryStream.ToArray();
var badgeTemplateBase64 = Convert.ToBase64String(byteImage);
return badgeTemplateBase64;
最后一步是将这张图片发送到浏览器,所以我调用的Ajax高于base64:
$.ajax({
url: "/Guests/PrintSingleFrontBadgeTemplate",
type: "post",
data: { guestTypeId: guestTypeId, guestId: guestId },
success: function (response) {
var popupWin = window.open('', '_blank', 'width=1200,height=800');
popupWin.document.open();
popupWin.document.write('<html><head></head><body"><img alt="Embedded Image" src="data:image/png;base64,' + response.frontBadgeTemplate + '" /></html>');
popupWin.document.close();
popupWin.print();
popupWin.close();
}
});
AND我能看到什么?巨大的图像需要3页...... 正如我所说,我的打印机在300 dpi下打印86mm x 54mm。 要打印整个区域,我需要1016像素x 638像素的图像。 为什么我的照片比我预期的大3倍?
令人惊讶的是,当我下载此图像并从Windows打印时,我在一页上有完美的精确图像。