我正在编写一个需要打印高分辨率.tiff图像的程序。我遇到的问题是我无法以高质量打印.tiff。由于.tiff(例如8700x7200)的大尺寸,它不适合任何标准尺寸的纸张。我尝试增加DPI,但似乎没有任何影响。我可以让.tiff适合页面的唯一方法是缩小它。但那时的形象有着可怕的品质。 (我将其缩小到适合11x17,但只有指定的分辨率1100x1700)。我尝试更改打印机上的分辨率ettings,尝试手动和编程设置打印机质量/分辨率,但没有成功。基本上我希望能够将.tiff的更多像素放到11x17页面上,这样我就不必按比例缩放。我认为增加打印dpi会增加11x17英寸的像素数量,但它没有影响我能看到。也许我做错了什么。任何帮助将不胜感激。感谢。
以下代码是我在调用pd.Print()时正在尝试做的事情。
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
//float x = ev.MarginBounds.Left;
//float y = ev.MarginBounds.Top;
try
{
//ResizeImage(@"H:\21RR-G0K-30140-0220-0002.tiff", @"H:\21RR-G0K-30140-0220-0002-new.tiff", 500, 900, false);
Image tempImage = Image.FromFile(@"H:\21RR-G0K-30140-0220-0002.tiff");
Bitmap bMap = new Bitmap(tempImage);
bMap.SetResolution(1200, 1200);
string l = "";
tempImage = bMap;
/*if (tempImage.Width > tempImage.Height) //if poster is longer then it is tall, rotate the image. Done to match standard printing aspect ratios
{
Bitmap tempBitmap = new Bitmap(tempImage); //Need to convert to Bitmap type to do rotation
RotateBicubic rotationFilter = new RotateBicubic(90, true);
tempImage = rotationFilter.Apply(tempBitmap);
}*/
float ImageAspectRatio = (float)tempImage.Height / (float)tempImage.Width;
float PageSizeAspectRatio = (float)_pSize.Height / (float)_pSize.Width; //_pSize is the selected printing sheet size
if (ImageAspectRatio < 1 && PageSizeAspectRatio > 1) //Need to rotate Image. Can't attempt to rotate tempImage due to size. Scale then rotate.
{
double x_scale = (double)_pSize.Width / (double)tempImage.Height;
double y_scale = (double)_pSize.Height / (double)tempImage.Width;
int percent = 0;
if (y_scale < x_scale)
{
percent = Convert.ToInt32(y_scale * 100);
}
else
{
percent = Convert.ToInt32(x_scale * 100);
}
Image myImage = ImageManipulation.ScaleByPercent(tempImage, percent); //I know this line is the problem, but I can't fit the image on the page without massive scaling due to the page reolution restraints
Bitmap tempMap = new Bitmap(myImage);
tempMap.SetResolution(1200, 1200);
RotateBicubic rotateBC = new RotateBicubic(90);
Image finalImage = rotateBC.Apply(tempMap); //rotate the image 90 degrees using bicubic interpolation. This isn't what's killing the quality as the quality is no better with this disabled
ev.Graphics.DrawImage(finalImage, 0, 0);
}
else if (ImageAspectRatio >= 1 && PageSizeAspectRatio >= 1) //No Need for rotation
{
double x_scale = (double)_pSize.Width / (double)tempImage.Width;
double y_scale = (double)_pSize.Height / (double)tempImage.Height;
int percent = 0;
if (y_scale < x_scale)
{
percent = Convert.ToInt32(y_scale * 100);
}
else
{
percent = Convert.ToInt32(x_scale * 100);
}
Image myImage = ImageManipulation.ScaleByPercent(tempImage, percent);
ev.Graphics.DrawImage(myImage, 0, 0);
}
else
{
}
}
catch(Exception ex)
{
string breakingpoint = "";
}
}
答案 0 :(得分:3)
您正在寻找的术语是“重新采样”。
最好使用设备坐标系或GDI + HIENGLISH单位缩放图像(我相信这是打印设备上下文中使用的内容。)
使用DrawImage命令,您最好从GDI +获得的是HighQualityBicubic Resampling。
Private Sub pd_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
Dim img As Image = Image.FromFile("SAMPLE.TIF")
Dim imageWidth As Integer = CInt((img.Width / img.HorizontalResolution) * 100)
Dim imageHeight As Integer = CInt((img.Height / img.VerticalResolution) * 100)
If imageWidth > e.PageBounds.Width Then
Dim ratio As Double = imageWidth / imageHeight
imageWidth = e.PageBounds.Width
If ratio < 1 Then
imageHeight = CInt(imageWidth * ratio)
Else
imageHeight = CInt(imageWidth / ratio)
End If
End If
If imageHeight > e.PageBounds.Height Then
Dim ratio As Double = imageHeight / imageWidth
imageHeight = e.PageBounds.Height
If ratio < 1 Then
imageWidth = CInt(imageHeight * ratio)
Else
imageWidth = CInt(imageHeight / ratio)
End If
End If
e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
e.Graphics.DrawImage(img, 0, 0, imageWidth, imageHeight)
End Sub
答案 1 :(得分:1)
问题出现在扩展例程中。也许你应该研究一些包含高质量缩放算法的第三方库。