2012-03-01 5 views
0

* .bmp를 영수증 프린터로 인쇄하려고합니다. 루프 내에서 픽셀 값 (16 진수)을 읽고 프린터 값을 프린터 명령에 추가하여 인쇄 한 다음 프린터에 씁니다. 프린터 API는 unsigned char 만 허용합니다. 이제 픽셀 값을 임시 파일에 기록합니다. 프린터 명령으로 unsigned char 배열을 구성하는 방법.런타임시 부호없는 char 배열에 값 추가

unsigned char printcommand [] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67 }; 

int len=sizeof(printcommand)/sizeof(unsigned char); 
printf("Length Of Array=%d\n", len); 

result = C56_api_printer_clear (iPrinter); 


/*----------READ RASTER DATA----------*/ 
for(r=0; r<=originalImage.rows - 1; r++) { 
    for(c=0; c<=originalImage.cols - 1; c++) { 
     /*-----read data and print in (row,column) form----*/ 
     fread(pChar, sizeof(char), 1, bmpInput); 
       // here instead of writing to file i need to append to printercommand[] 
     fprintf(rasterOutput, "0x%x,", *pChar); 
    } 
     // here i need to write to the printer as C56_api_printer_write(iPrinter, printcommand, sizeof(printcommand), 1000); 
    fprintf(rasterOutput, "\n"); 
} 

// close the printer 

모든 아이디어 어떻게 C 에서이 작업을 수행 할 수 있습니까?

미리 도움 주셔서 감사합니다.

답변

1

비트 맵의 ​​너비와 높이를 찾고 malloc 너비 * 높이의 메모리 블록을 찾은 다음 각 인덱스를 적절한 값으로 설정하면됩니다.

인쇄를 위해 프린터는 어떤 형식을 취합니까? 편지? 비트 압축 된 문자? 또한 어떤 유형의 비트 맵을 사용하고 있습니까? 1 비트? 24 비트?

+0

안녕 Aslai는 문자 배열은 픽셀 값을 포함하지 않을뿐만 아니라, 그것은 프린터 특정 명령을 시작해야합니다. 'Cmd + Row 1 => [1B CD 38 08 00 01 02 09 0 ....], Cmd + Row 2 => [1B CD 38 08 02 03 01 0A 0C ...]. 내가 사용하고있는 비트 맵 크기는 256x256입니다. – san

+0

모든 명령의 길이가 일정합니까? 그리고 당신이 필요로하는 행 승진 이외의 것이 있습니까? – Kaslai

+0

네 버디, 처음 네 바이트'[1B CD 38 08]'명령입니다. 프린터 버퍼에 쓰기 전에이 명령으로 행 데이터를 추가해야합니다. 그게 다야. – san

0

선언

unsigned char printcommand [] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67 }; 

정확히 7 바이트의 어레이를 생성한다. 배열 외부의 메모리에 쓸 수 있으므로 추가 할 수 없으며 다른 데이터 및/또는 코드를 덮어 쓸 수 있습니다. 당신이 할 수있는 일

은 다음과 같이 더 큰 크기로 배열을 선언 할 수 있습니다 :

이제 배열은 128 바이트, 당신의 일곱 바이트와 나머지로 시작하는이 제로로 가득되는
unsigned char printcommand [128] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0 }; 

합니다 (이니셜 라이저 목록의 마지막 값은 나머지 배열에 사용됩니다.)이 배열에 추가하려면 추가 할 다음 위치 또는 크기를 추적해야합니다. 이 같은 뭔가 :

int printcommand_current_size = 7; 

/* ... */ 

/* Append a new byte to the array */ 
printcommand[printcommand_current_size++] = *pChar; 

마지막 문은 배열에 새 바이트를 추가하고 크기를 증가시킵니다.

배열의 한계를 초과하여 추가하지 않으려면 검사를 추가해야합니다.

0

적절한 길이의 unsigned char[] 버퍼를 할당 할 수 있습니다. 한 번에 한 문자 씩 전체 행을 읽을 수 있습니다. 예 :

unsigned char *oneColumn; 
/* oneColumn needs enough room for the print command + data */ 
oneColumn = (unsigned char *)malloc(originalImage.cols - 1 + len); 

/* start off the buffer with the print command */ 
memcpy(oneColumn, printcommand, len); 

/* get one row of data from the file */ 
fread(oneColumn+len, sizeof(char), originalImage.cols - 1, bmpInput); 

그런 다음 버퍼 데이터를 인쇄 명령으로 보낼 수 있습니다.

(이것은 샘플 코드와 가정을 기반으로 - "픽셀"당 하나의 바이트)

+0

안녕하세요 @gregheo, 아이디어를 가져 주셔서 감사합니다. 'fread' 후에,'oneColumn'은 printcommand + one_row_data를 가질 것입니다. 내가 맞습니까? – san

+0

맞아. 'memcpy' 라인은 첫 번째'len' 바이트 수를 시작합니다; 'fread' 호출은 다음의'originalImage.cols - 1' 바이트 수를 채울 것입니다. – gregheo

+0

경고 : 경고 : 내장 함수 'memcpy''의 암시 적 선언이 호환되지 않습니다 : ( – san

관련 문제