好的伙计们。过了一段时间,我有一个有效的程序。这是delphi代码:
procedure TNativePrint.DoPrintBitmap(const ABitmap : TBitmap; const BitsPerSlice : byte);
const
Threshhold = 127;
type
TBitArray = array of boolean;
TRGBTripleArray = ARRAY[Word] of TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray; // Use a PByteArray for pf8bit color.
var
vCol : integer;
vRow : integer;
vIndex : integer;
vSliceIndex : integer;
vBytePos : integer;
vBitPos : integer;
vOffset : integer;
vLuminance : integer;
vLine: pRGBTripleArray;
vPixel: TRGBTriple;
vDots: TBitArray;
vSlice : byte;
vBit : byte;
vTmpBit: byte;
vVal: boolean;
vTempStr : string;
begin
if not Assigned(ABitmap) then exit;
try
ABitmap.PixelFormat := pf24bit;
SetLength(vDots, (ABitmap.Height * ABitmap.Width));
vIndex := 0;
for vRow := 0 to ABitmap.Height-1 do begin
vLine := ABitmap.Scanline[vRow];
for vCol := 0 to ABitmap.Width-1 do begin
vPixel := vLine[vCol];
vLuminance := Trunc((vPixel.rgbtRed * 0.3) + (vPixel.rgbtGreen * 0.59) + (vPixel.rgbtBlue * 0.11));
vDots[vIndex] := (vLuminance < Threshhold);
inc(vIndex);
end;
end;
DoSetLineSpacing(24);
DoAddLine(' ');
vOffset := 0;
while (vOffset < ABitmap.Height) do begin
DoAddLine(#$1B'*'#33+AnsiChar(Lo(ABitmap.Width))+AnsiChar(Hi(ABitmap.Width)), false);
vTempStr := '';
for vCol := 0 to ABitmap.Width-1 do begin
for vSliceIndex := 0 to 2 do begin
vSlice := 0;
for vBit := 0 to 7 do begin
vBytePos := (((vOffset div 8) + vSliceIndex) * 8) + vBit;
vBitPos := (vBytePos * ABitmap.Width) + vCol;
vVal := false;
if (vBitPos < Length(vDots)) then begin
vVal := vDots[vBitPos];
end;
vTmpBit := iff(vVal, 1, 0);
vSlice := vSlice or (vTmpBit shl (7 - vBit));
end;
vTempStr := vTempStr + AnsiChar(vSlice);
end;
end;
inc(vOffset, 24);
DoAddLine(vTempStr);
end;
DoSetLineSpacing(0);
DoAddLine(' ');
finally
vDots := nil;
end;
end;
图片已打印,但正如您在Picture上看到的那样,在每行之后我都有自由空间。正如您在源代码中看到的那样,在打印图像之前我将行间距设置为24,但它没有帮助。有人可以解释一下如何解决它吗?
答案 0 :(得分:0)
解决方案是以页面模式打印输出图像: 使用ESC'L'命令启用页面模式 设置打印区域ESC'W'xL xH yL yH dxL dxH dyL dyH 使用我在第一篇文章中的代码打印输出图像
此问题仅出现在EPSON TM-T88V上,在其他打印机上,您可以在标准模式下打印。
答案 1 :(得分:0)
我刚刚使用您的代码进行了一些修改,在Epson ESC打印机上打印位图并且工作正常。
1.删除所有空闲空间:
DoSetLineSpacing(24);
DoSetLineSpacing(0);
DoAddLine(' ');
DoAddLine(' ');
2.On
DoAddLine(vTempStr)
将CRLF(#13#10)
添加到vTempStr
字符串:
DoAddLine(vTempStr+#13#10);
多数民众赞成......