2008-11-21 7 views
3

La fonction ci-dessous imprime une image tramée couleur sur une imprimante PCL-5. La fonction a été adaptée à partir d'une fonction d'impression bicolore (1bpp) qui fonctionnait parfaitement, à l'exception de l'impression bicolore granuleuse. Le problème est que l'image sort avec une grande barre noire allant de la droite de l'image au bord de la page comme ceci:Les graphismes couleur PCL raster sont déformés. Code inclus: qu'est-ce qui me manque?

IMAGE######################################### 
    IMAGE#########AREA COMPLETELY BLACK########### 
    IMAGE######################################### 

L'image elle-même est parfait, sinon.

Divers outils PCL-to-PDF ne montrent pas l'image du tout, ce qui me porte à croire que j'ai oublié de faire quelque chose. Des réinitialisations appropriées (\ u001bE \ u001b% -12345X) ont déjà été envoyées et les flux de pages suivants.

Tous les experts PCL disponibles? J'ai le Manuel de référence technique PCL 5 Color, et ça m'a permis d'aller aussi loin. Cette dernière chose me rend fou quand même.

* Edit: Je sais maintenant ce que la commande est à l'origine du problème, mais je ne sais pas pourquoi:

stream("\u001b*r0F"); 

Cela devrait garder l'image en rotation avec la page (portrait, paysage). Si je supprime cela, le problème disparaît. Je peux compenser en tournant le bitmap au préalable, mais je veux vraiment savoir ce qui a causé ça!

static void PrintImage() 
    { 
     // Get an image into memory 
     Image original = Image.FromFile("c:\\temp\\test.jpg"); 
     Bitmap newBitmap = new Bitmap(original, original.Width, original.Height); 

     stream(String.Format("\u001b*p{0:d}x*p{1:d}Y", 1000, 1000));// Set cursor. 
     stream("\u001b*t300R");          // 300 DPI 
     stream(String.Format("\u001b*r{0:d}T", original.Height)); // Height 
     stream(String.Format("\u001b*r{0:d}S", original.Width)); // Width 

     stream("\u001b*r3U");  // 8-bit color palette 
     stream("\u001b*r0F");  // Follow logical page layout (landscape, portrait, etc..) 
     // Set palette depth, 3 bytes per pixel RGB 
     stream("\u001b*v6W\u0000\u0003\u0000\u0008\u0008\u0008"); 
     stream("\u001b*r1A");  // Start raster graphics 
     stream("\u001b*b0M");  // Compression 0 = None, 1 = Run Length Encoding 

     // Not fast, but fast enough. 
     List<byte> colors = new List<byte>(); 
     for (int y2 = 0; y2 < original.Height; y2++) 
     { 
      colors.Clear(); 
      for (int x2 = 0; x2 < original.Width; x2++) 
      { 
       Color c = newBitmap.GetPixel(x2, y2); 
       colors.Add(c.R); 
       colors.Add(c.G); 
       colors.Add(c.B); 
      } 

      stream(String.Format("\u001b*b{0}W", colors.Count));  // Length of data to send 
      streamBytes(colors.ToArray());       // Binary data 
     } 
     stream("\u001b*rB"); // End raster graphics (also tried *rC -- no effect) 
    } 

Répondre

4

Il y a quelques problèmes avec votre code. Tout d'abord votre code de position du curseur est incorrect, il faut lire:

"\u001b*p{0:d}x1:d}Y", 1000, 1000 

Cela équivaut à:

<esc>*p1000x1000Y 

vous aviez:

<esc>*p1000x*p1000Y 

Lors de l'assemblage des commandes PCL ensemble, vous correspondre à la même valeur et groupe paramétrés, puis ajoutez simplement la valeur + le caractère paramétré + la valeur + le caractère paramétré etc. Assurez-vous que le caractère final paramétré est une lettre majuscule qui signifie la fin de la commande PCL.

Aussi lors de la définition d'une image je vous recommande également de spécifier la largeur & en décipoints, cela devrait aider à la mise à l'échelle de l'image (* r3A) sur la page, ajoutez ceci (juste après que votre commande de résolution soit correcte place pour elle):

Int32 deciHeight = original.Height/(int)original.HorizontalResolution * 720; 
Int32 deciWidth = original.Width/(int)original.VerticalResolution * 720; 
stream("\u001b*t{0:d}h{1:d}V", deciHeight, deciWidth)); 

l'autre recommandation est d'écrire tout cela pour déposer (regarder vos encodages) et utiliser l'un des rares de téléspectateurs PCL pour afficher vos données contre toujours l'imprimer. Devrait vous faire gagner du temps et une forêt ou deux! Je les ai tous essayés et je recommande de dépenser 89 $ et d'acheter pclWorks. Ils ont également un SDK complet si vous allez faire beaucoup de PCL. Nous n'utilisons pas cela car nous codons tout PCL nous-mêmes mais ça a l'air bien. En ce qui concerne la rotation, nous avons eu des problèmes sur certains périphériques, vous pouvez simplement faire pivoter le jpg d'abord (original.RotateFlip) puis l'écrire.

Je n'ai pas beaucoup de temps aujourd'hui mais j'espère que mes commentaires vous seront utiles. Je peux tester votre code le lundi ou le mardi et travailler avec et poster d'autres commentaires.Gardez à l'esprit que même si PCL est une norme, son support de fabricant à fabricant et d'appareil à périphérique peut être un problème et très différent. Lorsque vous faites des choses de base, la plupart des appareils semblent bien; Cependant, si vous utilisez des macros ou des graphiques complexes, vous trouverez des différences.

+1

Le positionnement était une erreur de couper-coller (le vôtre a aussi une faute de frappe). J'ai décidé d'oublier la rotation PCL, et de me tourner moi-même. Résolu tous mes problèmes. Nous utilisons deux visualiseurs PCL ici, et aucun n'a montré le problème, seulement l'imprimante elle-même. Je suis toujours perplexe mais j'ai un code de travail. –

Questions connexes