C#如何实现大图片(2000*32767象素)的打印呢?

时间:2022-09-11 07:51:15
现在有一个大图片(长为32767个象素,宽为2000个象素),不管我我如何设置纸张的大小,就是不能完整的将它打印出来,为此,我找了一个宽幅打印机,想用连续卷筒纸的方式将它给打印出来,可又不知道该如何实现的,还请各位高手现身说教,在此,我就隔着河作揖---感激不过了。

20 个解决方案

#1


up

#2


up

#3


gz

#4


如果打印机支持那么大的纸的话,就能够打印,
如果打印机不支持大纸,可以将图片通过程序分割,分别打印,然后再把多张纸拼接起来.
宽幅打印机是支持大纸张的,如2M*2M的.

#5


如何分割大图片呢?

#6


分割--合并--打印机?

#7


那么如果现在给你一个36厘米宽,长为820厘米的位图(*.bmp)图片,使用US Standard Fanfold 的卷筒纸连续打印,又是如何用C#将图片进行各位高手所说的图片分割和合并打印呢?

#8


God,帮你up一下,再帮你查查。

#9


设定纸的宽度就可以了啊。不用分块

#10


怎么设定纸的宽度呢?又是如何实现的呢?有没有现成的代码参考呢?在此,我先隔着河作揖---感激不过了!

#11


关注

#12


不知是要原图尺寸打印,还是缩小适合纸张打印?
适合纸张
PrintDocument prndoc=new PrintDocument();
PrinterSettings prnset=new PrinterSettings();//放在声明变量中

prndoc.PrintPage+=new PrintPageEventHandler(OnPrintPage);//
加入打印事件,放在构造函数中
prndoc.DefaultPageSettings.PaperSize=prnset.DefaultPageSettings.PaperSize;//设默认纸张也可以自定义,放在构造函数中

private void buttonprint_Click(object sender, System.EventArgs e)//定义一个打印按钮事件
 {
prndoc.Print();
}
//打印事件
void OnPrintPage(object obj, PrintPageEventArgs ppea) 
{
Graphics   grfx  = ppea.Graphics;
RectangleF rectf = new RectangleF(ppea.MarginBounds.Left - (ppea.PageBounds.Width - grfx.VisibleClipBounds.Width) / 2,
ppea.MarginBounds.Top - 
(ppea.PageBounds.Height - grfx.VisibleClipBounds.Height) / 2, ppea.MarginBounds.Width,ppea.MarginBounds.Height);
ppea.Graphics.DrawString(this.textBoxTittle.Text,this.Font,new SolidBrush(ForeColor),this.movelabel1.Location );

ScaleImageIsotropically(grfx, printimage, rectf);//调绘图函数
}


//绘图函数
void ScaleImageIsotropically(Graphics grfx, Image image, 
RectangleF rectf) {
//取图像尺寸大小,英寸
SizeF sizef = new SizeF(image.Width / image.HorizontalResolution,
image.Height / image.VerticalResolution);
//打印框尺寸与图像尺寸大小缩放比例,宽度适匹,或高度适匹
float fScale = Math.Min(rectf.Width/sizef.Width,rectf.Height/sizef.Height);

sizef.Width  *= fScale;
sizef.Height *= fScale;
RectangleF rectf1=new RectangleF( rectf.X + (rectf.Width  - sizef.Width ) / 2,
rectf.Y + (rectf.Height - sizef.Height) / 2,
sizef.Width, sizef.Height);//得到一个居中的打印或绘图框
if(!this.checkBoxFill.Checked){//实际大小打印不缩放
float fScalew=(image.Width / image.HorizontalResolution)*100/(float)(this.prndoc.DefaultPageSettings.Bounds.Width-this.prndoc.DefaultPageSettings.Margins.Left-this.prndoc.DefaultPageSettings.Margins.Right);
float fScaleh=image.Height/image.VerticalResolution*100/(float)(this.prndoc.DefaultPageSettings.Bounds.Height-this.prndoc.DefaultPageSettings.Margins.Top-this.prndoc.DefaultPageSettings.Margins.Bottom);
rectf1.Width=rectf.Width *fScalew;
rectf1.Height=rectf.Height*fScaleh;
rectf1.X =rectf.X ;
rectf1.Y=rectf.Y ;

}if(!this.checkBoxH.Checked)//不水平居中
 rectf1.X =rectf.X ;
if(!this.checkBoxV.Checked)//不垂直居中
rectf1.Y=rectf.Y ;
grfx.DrawImage(printimage,rectf1);
}

#13


做几个选择按钮选实际大小,或居中。

#14


up

#15


UP

#16


gz

#17


up

#18



如果打印机支持那么大的纸的话,就能够打印,
如果打印机不支持大纸,可以将图片通过程序分割,分别打印,然后再把多张纸拼接起来.
宽幅打印机是支持大纸张的,如2M*2M的.

#19


gz

#20


up

#1


up

#2


up

#3


gz

#4


如果打印机支持那么大的纸的话,就能够打印,
如果打印机不支持大纸,可以将图片通过程序分割,分别打印,然后再把多张纸拼接起来.
宽幅打印机是支持大纸张的,如2M*2M的.

#5


如何分割大图片呢?

#6


分割--合并--打印机?

#7


那么如果现在给你一个36厘米宽,长为820厘米的位图(*.bmp)图片,使用US Standard Fanfold 的卷筒纸连续打印,又是如何用C#将图片进行各位高手所说的图片分割和合并打印呢?

#8


God,帮你up一下,再帮你查查。

#9


设定纸的宽度就可以了啊。不用分块

#10


怎么设定纸的宽度呢?又是如何实现的呢?有没有现成的代码参考呢?在此,我先隔着河作揖---感激不过了!

#11


关注

#12


不知是要原图尺寸打印,还是缩小适合纸张打印?
适合纸张
PrintDocument prndoc=new PrintDocument();
PrinterSettings prnset=new PrinterSettings();//放在声明变量中

prndoc.PrintPage+=new PrintPageEventHandler(OnPrintPage);//
加入打印事件,放在构造函数中
prndoc.DefaultPageSettings.PaperSize=prnset.DefaultPageSettings.PaperSize;//设默认纸张也可以自定义,放在构造函数中

private void buttonprint_Click(object sender, System.EventArgs e)//定义一个打印按钮事件
 {
prndoc.Print();
}
//打印事件
void OnPrintPage(object obj, PrintPageEventArgs ppea) 
{
Graphics   grfx  = ppea.Graphics;
RectangleF rectf = new RectangleF(ppea.MarginBounds.Left - (ppea.PageBounds.Width - grfx.VisibleClipBounds.Width) / 2,
ppea.MarginBounds.Top - 
(ppea.PageBounds.Height - grfx.VisibleClipBounds.Height) / 2, ppea.MarginBounds.Width,ppea.MarginBounds.Height);
ppea.Graphics.DrawString(this.textBoxTittle.Text,this.Font,new SolidBrush(ForeColor),this.movelabel1.Location );

ScaleImageIsotropically(grfx, printimage, rectf);//调绘图函数
}


//绘图函数
void ScaleImageIsotropically(Graphics grfx, Image image, 
RectangleF rectf) {
//取图像尺寸大小,英寸
SizeF sizef = new SizeF(image.Width / image.HorizontalResolution,
image.Height / image.VerticalResolution);
//打印框尺寸与图像尺寸大小缩放比例,宽度适匹,或高度适匹
float fScale = Math.Min(rectf.Width/sizef.Width,rectf.Height/sizef.Height);

sizef.Width  *= fScale;
sizef.Height *= fScale;
RectangleF rectf1=new RectangleF( rectf.X + (rectf.Width  - sizef.Width ) / 2,
rectf.Y + (rectf.Height - sizef.Height) / 2,
sizef.Width, sizef.Height);//得到一个居中的打印或绘图框
if(!this.checkBoxFill.Checked){//实际大小打印不缩放
float fScalew=(image.Width / image.HorizontalResolution)*100/(float)(this.prndoc.DefaultPageSettings.Bounds.Width-this.prndoc.DefaultPageSettings.Margins.Left-this.prndoc.DefaultPageSettings.Margins.Right);
float fScaleh=image.Height/image.VerticalResolution*100/(float)(this.prndoc.DefaultPageSettings.Bounds.Height-this.prndoc.DefaultPageSettings.Margins.Top-this.prndoc.DefaultPageSettings.Margins.Bottom);
rectf1.Width=rectf.Width *fScalew;
rectf1.Height=rectf.Height*fScaleh;
rectf1.X =rectf.X ;
rectf1.Y=rectf.Y ;

}if(!this.checkBoxH.Checked)//不水平居中
 rectf1.X =rectf.X ;
if(!this.checkBoxV.Checked)//不垂直居中
rectf1.Y=rectf.Y ;
grfx.DrawImage(printimage,rectf1);
}

#13


做几个选择按钮选实际大小,或居中。

#14


up

#15


UP

#16


gz

#17


up

#18



如果打印机支持那么大的纸的话,就能够打印,
如果打印机不支持大纸,可以将图片通过程序分割,分别打印,然后再把多张纸拼接起来.
宽幅打印机是支持大纸张的,如2M*2M的.

#19


gz

#20


up

#21