2009-07-03 5 views
3

J'écris un programme qui doit imprimer des images .tiff haute résolution. Le problème que j'ai est que je ne peux pas imprimer le .tiff de bonne qualité. En raison de la grande taille du .tiff (8700x7200 par exemple) Il ne rentre pas sur n'importe quelle feuille de taille standard. J'ai essayé d'augmenter le DPI mais cela ne semblait pas avoir d'effet. La seule façon que je peux obtenir le .tiff pour adapter la page est de la réduire. mais alors l'image a une qualité horrible. (Je le redimensionne pour tenir sur un 11x17, mais qui a seulement une résolution indiquée de 1100x1700). J'ai essayé de changer les résolutions sur l'imprimante, essayé manuellement et en programmant la qualité/résolution de l'imprimante mais sans succès. Fondamentalement, je veux être en mesure d'ajouter plus de pixels du fichier .tiff sur la page 11x17 afin que je n'ai pas à l'échelle autant. Je pensais que l'augmentation de la dpi d'impression augmenterait la quantité de pixels sur un 11x17 pouces, mais il n'a eu aucun effet que je pouvais voir. Peut-être que je fais quelque chose de mal. Toute aide serait grandement appréciée. Merci.Amélioration de la qualité d'impression pour les images

Le code ci-dessous est ce que j'essaie de faire maintenant lorsque pd.Print() est appelé.

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 = ""; 
     } 
    } 

Répondre

3

Le terme que vous recherchez est "rééchantillonnage".

Il est aussi probablement préférable de redimensionner l'image à l'aide du dispositif système de coordonnées ou les unités de GDI + HIENGLISH (je crois que ce qui est utilisé sur un contexte de périphérique d'impression.)

en utilisant la commande DrawImage le meilleur que vous allez obtenir de GDI + est le rééchantillonnage HighQualityBicubic.


    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

Il semble que le problème se situe dans la routine de mise à l'échelle. Peut-être que vous devriez regarder dans certaines bibliothèques tierces qui incluent des algorithmes de mise à l'échelle de haute qualité.

+0

Quel est ce que vous recommandez? en ce moment j'utilise la bibliothèque AForge Imaging – Megatron

Questions connexes