PCL cor raster gráficos distorcidos. Código incluído: o que eu estou ausente?
-
08-07-2019 - |
Pergunta
A função abaixo imprime uma imagem raster de cor para uma impressora PCL-5. A função foi adaptado de um colorido 2 (1bpp) função de impressão tivemos que funcionou perfeitamente, exceto para a impressão de 2 cores granuladas. O problema é que a imagem sai com uma grande barra preta que se estende desde o direito da imagem para a borda da página como esta:
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################
A imagem em si parece perfeito, caso contrário.
Várias ferramentas PCL-to-PDF não mostram a imagem em tudo, o que me leva a acreditar que eu esqueci fazer alguma coisa. resets apropriadas (\ u001bE \ u001b% -12345X) foram enviados antes, e página alimentações depois.
Qualquer especialistas PCL lá fora? Eu tenho o Manual PCL 5 Color Technical Reference, e isso está me este ido longe. Esta última coisa que está me deixando embora louco.
* Edit: Agora eu sei o que o comando está causando o problema, mas eu não sei por que:
stream("\u001b*r0F");
Isso deve manter a imagem girada junto com a página (retrato, paisagem). Se eu remover esse, o problema desaparece. I podem compensar pela rotação do bitmap de antemão, mas eu realmente quero saber o que causou isso!
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)
}
Solução
Existem alguns problemas com o seu código. Primeiro o seu código de posição do cursor estiver incorreto, deve ler-se:
"\u001b*p{0:d}x1:d}Y", 1000, 1000
Isso equivale a:
<esc>*p1000x1000Y
você teve:
<esc>*p1000x*p1000Y
Ao aderir comandos PCL juntos, você igualar-se o mesmo valor parametrizado e de grupo e, em seguida, basta adicionar valor + caráter + valor de caracteres parametrizada parametrizada + etc. Certifique-se de que o personagem parametrizada final é uma letra maiúscula que significa o fim do comando PCL .
Além disso, quando a definição de uma imagem que eu recomendo que você também especificar a largura e altura em decipoints, isso deve ajudar com a escala da imagem (* R3A) na página para adicionar este (logo após o seu comando resolução deve ser um lugar bem para ele):
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));
A outra recomendação é para escrever tudo isso para arquivo (assista suas codificações) e uso um do punhado de espectadores PCL para ver o seu vs. dados sempre imprimi-lo. Deve poupar algum tempo e uma floresta ou dois! Eu tentei todos eles e Wold recomendo passar a US $ 89 e comprando PCLWorks . Eles também têm um SDK completo se você vai fazer um monte de PCL. Nós não usar isso como nós codificar todos PCL nós mesmos, mas isso parece bom.
Quanto a rotação, nós tivemos problemas em algum dispositivo, Você só pode girar a do jpg primeiro (original.RotateFlip) um, em seguida, escrevê-lo.
Eu não tenho muito tempo hoje, mas espero que meus comentários ajudar. Eu posso testar o seu código na segunda-feira ou terça-feira e trabalhar com ele e publicar quaisquer comentários adicionais.
Tenha em mente que mesmo que PCL é um padrão seu apoio de fabricante para fabricante e dispositivo para dispositivo pode ser um problema e muito diferente. Ao fazer coisas básicas a maioria dos dispositivos parecem bem; No entanto, se você entrar em macros ou gráficos complexos você vai encontrar diferença.