读书人

关于图像打印解决方法

发布时间: 2012-03-06 20:47:55 作者: rapoo

关于图像打印
为什么我打印TImage里面的图像总是很小的?ImageRight->Width=1199;ImageRight->Height=727.我想整张A4纸都显示。
TPrinter *tPrinter;
tPrinter = Printer();
System::WideChar *ADevice, *ADriver, *APort;
THandle DeviceMode;
PDeviceMode DevMode;
ADevice=new WideChar[100];
ADriver=new WideChar[100];
APort=new WideChar[100];
HDC hPrinter;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
TRect r1,r2;

if (!PrintDialog1->Execute()) {
return;
}

tPrinter-> GetPrinterA(ADevice, ADriver, APort,DeviceMode);
GetDeviceCaps(hPrinter,LOGPIXELSX);


r1 = Rect(0, 0, ImageRight-> Width, ImageRight-> Height);

pBitmap->Width = ImageRight->Width;
pBitmap->Height = ImageRight->Height;

pBitmap->Canvas-> CopyRect(r1,ImageRight->Canvas, r1);

pBitmap->HandleType = bmDIB;

r2 = Rect(0, 0,pBitmap->Width, pBitmap->Height);

Bits = bp-> Handle;
Graphics::GetDIBSizes(Bits,InfoSize,ImageSize);
PBitmapInfo Info = ( PBitmapInfo ) new char[InfoSize];
Image = new char[ImageSize];
GetDIB(Bits,NULL,Info,Image);
// TPrinter *p = Printer();
tPrinter-> BeginDoc();
StretchDIBits(tPrinter-> Canvas-> Handle,
400, 400,400*2,600*2, // *2的目的为放大图形
0, 0, 400,600,
Image, Info, DIB_RGB_COLORS, SRCCOPY);

// tPrinter-> BeginDoc();
// tPrinter-> Canvas-> StretchDraw(r1, pBitmap);
tPrinter-> EndDoc();
delete pBitmap;

[解决办法]
原因很简单,打印机分辨率的问题,现在的激光大概是300或600dpi,也就是一寸大概300或600个点,你的图像如果是1200个像素,1:1输出到600dpi打印机也就2寸大小。

办法:
1.获取到打印机分辨率:(单位:像素数/英寸)

PixelperInchH = GetDeviceCaps(Prntr->Handle, LOGPIXELSX);
PixelperInchV = GetDeviceCaps(Prntr->Handle, LOGPIXELSY);

或获取打印纸张的物理像素数:
long phywidth = GetDeviceCaps(Prntr->Handle, PHYSICALWIDTH);
long phyheight = GetDeviceCaps(Prntr->Handle, PHYSICALHEIGHT);

这两对值可以互相换算,如对A4纸张: 1英寸=2.54厘米

大体上 phywidth = 21 / 2.54 * PixelperInchH

2.根据你准备输出的物理大小,设宽度为W 厘米, 计算你需要在打印机上输出的像素大小:
xWidth =( W / 2.54 *PixelperInchH ) ;
如果正好是整张纸宽度:xWidth =phywidth ;


同理,获取垂直方向大小:H纸上输出的图像大小(厘米)
yHeight = H / 2.54 *PixelperInchV ;

3.使用打印机画布输出:
Printer->BenginDoc()
TRect R = Rect{0,0,xWidth,yHeight );
Printer->Canvsa->StretchDraw(R , Img->Picture->Bitmap); //如果位图在Image 组件

Printer->Canvsa->StretchDraw(R , Bmp); //如果位图在TBitmap对象里

Printer->EndDoc();

只有设定好准备输出图片的物理大小W和H (单位:厘米),这段代码保证在不同分辨率下的打印机输出的图片大小是一样的。

读书人网 >C++ Builder

热点推荐