PCL 래스터 컬러 그래픽이 왜곡되었습니다. 코드 포함 : 무엇이 누락 되었습니까?
-
08-07-2019 - |
문제
아래의 기능은 컬러 래스터 이미지를 PCL-5 프린터에 인쇄합니다. 이 기능은 거친 2 색 인쇄를 제외하고는 완벽하게 작동 한 2 색 (1BPP) 인쇄 기능에서 조정되었습니다. 문제는 이미지가 이미지의 오른쪽에서 페이지의 가장자리로 확장되는 큰 검은 색 막대가 나오는 것입니다.
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################
이미지 자체는 완벽 해 보입니다.
다양한 PCL-to-PDF 도구는 이미지를 전혀 보여주지 않으므로 잊어 버린 것을 믿게됩니다. 적절한 재설정 ( u001be u001b%-12345x)이 이전에 전송되었고 그 후 페이지 공급이 전송되었습니다.
거기에 PCL 전문가가 있습니까? 나는 PCL 5 컬러 기술 참조 매뉴얼을 가지고 있었고 지금까지 나를 얻었다. 이 마지막은 나를 미치게 만들고 있습니다.
*편집 : 이제 어떤 명령이 문제를 일으키는 지 알고 있지만 그 이유를 모르겠습니다.
stream("\u001b*r0F");
이렇게하면 이미지가 페이지 (초상화, 풍경)와 함께 회전해야합니다. 이것을 제거하면 문제가 사라집니다. 비트 맵을 미리 회전시켜 보상 할 수는 있지만,이 원인이 무엇인지 정말로 알고 싶습니다!
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)
}
해결책
코드에는 몇 가지 문제가 있습니다. 먼저 커서 위치 코드가 올바르지 않으면 다음을 읽어야합니다.
"\u001b*p{0:d}x1:d}Y", 1000, 1000
이것은 다음과 같습니다.
<esc>*p1000x1000Y
당신은 :
<esc>*p1000x*p1000Y
PCL 명령에 합류 할 때 동일한 매개 변수화 된 값과 그룹을 일치시킨 다음 값 + 매개 변수화 된 문자 + value + 매개 변수화 된 문자 등을 추가합니다. 최종 매개 변수화 된 문자가 PCL 명령의 끝을 의미하는 대문자인지 확인하십시오.
또한 이미지를 정의 할 때 디피 포인트의 너비 및 하이트를 지정하는 것이 좋습니다. 이렇게하면 페이지의 이미지 스케일링 (*r3a)에 도움이 되므로이 추가 (해상도 명령이 괜찮은 후에는 괜찮습니다). :
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));
다른 권장 사항은이 모든 것을 파일에 작성하고 (인코딩을보고) 소수의 PCL 뷰어 중 하나를 사용하여 데이터를보고 항상 인쇄하는 것입니다. 시간과 숲 한두 시간을 절약해야합니다! 나는 그들 모두를 시도했고 Wold는 89 달러를 지출하고 구매하는 것을 권장합니다. pclworks. PCL을 많이 할 경우 완전한 SDK가 있습니다. 우리는 모든 PCL을 직접 코딩 할 때 사용하지 않지만 좋아 보입니다.
회전과 관련하여 일부 장치에 문제가 있었으며 JPG를 먼저 회전시킬 수 있습니다 (Original.rotateFlip).
오늘은 시간이 많지 않지만 내 의견이 도움이되기를 바랍니다. 월요일이나 화요일에 코드를 테스트하고 작업하고 추가 의견을 게시 할 수 있습니다.
PCL이 표준이지만 제조업체에서 제조업체 및 장치에 대한 장치에 대한 지원은 문제가되고 크게 다를 수 있습니다. 기본적인 일을 할 때 대부분의 장치는 괜찮아 보입니다. 그러나 매크로 또는 복잡한 그래픽에 들어가면 차이가 있습니다.