我想打印我的表格,但打印的图像非常模糊。实际上它是如此模糊,我无法阅读它。
首先,我抓住我的表格:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
internal void CaptureScreen()
{
Application.DoEvents();
Graphics mygraphics = frm.CreateGraphics();
Size s = frm.Size;
memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
Graphics memoryGraphics = Graphics.FromImage(memoryImage);
IntPtr dc1 = mygraphics.GetHdc();
IntPtr dc2 = memoryGraphics.GetHdc();
BitBlt(dc2, 0, 0, frm.ClientRectangle.Width, frm.ClientRectangle.Height, dc1, 0, 0, 13369376);
mygraphics.ReleaseHdc(dc1);
memoryGraphics.ReleaseHdc(dc2);
}
此处的屏幕图像清晰锐利。
这是OnPrintPage方法:
private void OnPrintPage(object sender, PrintPageEventArgs e)
{
Bitmap img;
int width = e.MarginBounds.Width;
int height = e.MarginBounds.Height;
if (memoryImage.Size.Width > width || memoryImage.Size.Height > height)
{
img = ResizeImage(memoryImage, new Size(width, height));
}
else
{
img = memoryImage;
}
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.DrawImage(img, e.MarginBounds.Top, e.MarginBounds.Left);
}
调整方法:
private static Bitmap ResizeImage(Bitmap imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return b;
}
我知道调整图像大小会使图像变得模糊。但是在打印页面上绘制它会使它更加模糊。
是否有任何技巧可以锐化图像?我做错了吗?
谢谢大家。
答案 0 :(得分:2)
我不知道这是否能彻底解决您的问题,但您应该使用InterpolationMode。 HighQualityBicubic 而不是InterpolationMode.HighQualityBilinear。
此外,从表单中获取位图的很多更简单的方法是使用表单的 DrawToBitmap 方法。
答案 1 :(得分:1)
在翻阅代码之前,先提出一个问题:您尝试打印的原始图像的大小和质量是多少?原始图像的大小是多少,打印时缩放的大小是多少?你能发布一个这样的图像链接吗?作为新用户,您只能使用一个链接/问题,但这应该足够了。请记住,您的花园种类打印机的屏幕分辨率大约是 100倍。向上缩放图像越多,每个像素变得越大和“模糊”。在打印和放大图像时,小图像或稍微模糊的屏幕图像看起来很糟糕。
一百次:屏幕dpi通常在96到120点/英寸之间。一台好的打印机是600到1200 dpi。每边10 x =分辨率的约100倍。