选中一张图片,把这张图片传到打印预览的窗口里面。这里的关键在于如何使大分辨率的图片完整的打印出来,使图片能够根据打印纸张的大小进行相应的缩放,避免图片溢出而打印不全。首先要获取打印要纸张的宽和高,然后获取要打印图片的分辨率,最后判断是否将图片旋转90度显示,以方便平铺到打印机的纸张上。
打印预览的窗体由VS工具箱里面的控件提供,这个控件是PrintPreviewDialog,它可以向用户显示关联文档打印时的样子。但是显示这个窗体的时候,需要把当前的图片传递进去。这就要用到另一个控件PrintDocument,它可以定义一个向打印机发送输出的对象。PrintDocument里面有一个PrintPage事件,使用如下代码将PrintPage控件和PrintPreviewDialog控件关联起来后,当打开PrintPreviewDialog窗体时,就会触发这个PrintPage事件,并且这个对象会对将要打印的对象做一个处理,使打印预览能够正常显示。ppdPicture.Document = pdOutObject; //ppdPicture是PrintPreviewDialog的实体对象,pdOutObject是PrintDocument的实体对象
ppdPicture.ShowDialog(); //显示打印预览窗体
在PrintPage事件里面,需要对打印对象做如下处理,代码:private void pdOutObject_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
string fullName = lbPictureName.SelectedItem.ToString(); //图片的全名
string fullPath = GetPictureFullPath(fullName); //图片的全路径
int printWidth = pdOutObject.DefaultPageSettings.PaperSize.Width; //打印机纸张的宽度
int printHeight = pdOutObject.DefaultPageSettings.PaperSize.Height; //打印机纸张的高度
int picWidth = pbShowPicture.Image.Width; //图片的宽度
int picHeight = pbShowPicture.Image.Height; //图片的高度
//判断图片的宽度是否小于打印纸张的宽度
if (picWidth <= printWidth) //如果图片的宽度小于或等于纸张的宽度,则让图片处于纸张正中间
{
float x = (printWidth - picWidth) / 2; //设置图片显示的水平位置
float y = (printHeight - picHeight) / 2; //设置图片显示的垂直位置
//使用DrawImage方法重新绘制图片
e.Graphics.DrawImage(Image.FromFile(fullPath), x, y, picWidth, picHeight);
}
else
{
if (picWidth > picHeight) //判断图片的宽度是否大于高度,如果大于,就把图片旋转90度显示
{
Bitmap bm = (Bitmap)Bitmap.FromFile(fullPath); //以原图片路径创建一个新的图像
bm.RotateFlip(RotateFlipType.Rotate90FlipXY); //把图片旋转90度
//计算图片高度占纸张宽度的比例
Single ratio = printWidth / picHeight;
e.Graphics.DrawImage(bm, 0, 0, picHeight * ratio, picWidth * ratio);
}
else //如果图片宽度小于等于高度,就把图片按比例缩放显示
{
Single ratio = picWidth / printWidth;
e.Graphics.DrawImage(Image.FromFile(fullPath), 0, 0, printWidth * ratio, printHeight * ratio);
}
}
}
注意:Bitmap位于System.Drawing命名空间,用于封装GDI+位图,处理由像素数据定义的图像对象。
e.Graphics.DrawImage()方法用于在指定的位置按照指定的大小绘制指定的图像(System.Drawing.Image)。