Increasing Print Quality for images

c#, printing

Solution

The term you are looking for is "resampling."

It's also probably best to scale the image using the device coordinate system or the GDI+ HIENGLISH units (I believe that's what's used on a printing device context.)

Using the DrawImage command the best you're going to get from GDI+ is the 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

Problem

I'm writing a program that needs to print off high resolution .tiff images. The problem I'm having is that I can't print the .tiff's in good quality. Due to the large size of the .tiff (8700x7200 for instance) It will not fit on any standard sized sheet. I tried increasing the DPI but that didn't seem to have any effect. The only way i can get the .tiff to fit the page is to scale it down. but then the image has horrendous quality. (I scale it down to fit on a 11x17, but that only has an indicated resolution of 1100x1700). i tried changing the resolutions ettings on the printer, tried manually and programatically setting the printer quality/resolution but to no success. Basically I want to be able to fit more pixels of the .tiff onto the 11x17 page so I don't have to scale as much. I thought increasing the print dpi would increase the amount of pixels on an 11x17 inches, but it had no effect I could see. Maybe I'm doing something wrong. Any help would be greatly appreciated. thanks. The code below is what I'm attempting to do right now when pd.Print() is invoked. ``` 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 = ""; } } ```

Original source