使用蓝牙热敏打印机与 Firemonkey Android 打印位图

问题描述 投票:0回答:2

我有这个代码成功使用 android 使用 firemonkey delphi 使用蓝牙热敏打印机打印文本, 我的朋友修改了打印位图,但是过程 bitmaptostr 出现了一些错误访问冲突。

procedure TBluetoothPrinter.Send(Data: TArray<Byte>);
begin
  if Data = nil then
    Exit; // nothing to write

  Check(OutputStream <> nil, 'Cannot retrieve output stream');
  OutputStream.write(ToJavaByteArray(Data));
end;

procedure Printing(sText: string);
begin
  with TBluetoothPrinter.Create do
  begin
    Send(TEncoding.ANSI.GetBytes(sText + CRLF));
  end;
end;

function BitmapToStr(BMP: TBitmap; EscapeStr:String; SliceEscapeStr:String; BitsSlice: Byte = 8):String;
var
  BMPData: TBitmapData;
  AColor: TAlphaColor;

  nCol, nRow, nIndex: integer;
  nOffset, nBytePos, nBitPos: integer;
  nSliceIndex, nLum: integer;
  nSlice, nBit, nTmpBit, BytesSlice: byte;
  ADots: Array of boolean;
  sSlice: String;
begin
  try
    SetLength(ADots, (BMP.Height * BMP.Width));
    nIndex := 0;

    for nRow := 0 to BMP.Height-1 do
    begin
      for nCol := 0 to BMP.Width-1 do
      begin
        AColor := BMPData.GetPixel(nCol, nRow);
        nLum := Trunc((TAlphaColorRec(AColor).R * 0.3)  + (TAlphaColorRec(AColor).G * 0.59) + (TAlphaColorRec(AColor).B * 0.11));
        ADots[nIndex] := (nLum < 127);
        inc(nIndex);
      end;
    end;

   BytesSlice := (BitsSlice div 8);

    if BitsSlice mod 8 > 0 then
      inc(BytesSlice);

    Result := EscapeStr;
    nOffset := 0;
    while (nOffset < BMP.Height) do
    begin
      Result := Result + SliceEscapeStr;

      for nCol := 0 to BMP.Width-1 do
      begin
        for nSliceIndex := 0 to BytesSlice - 1 do
        begin
          nSlice := 0;
          for nBit := 0 to 7 do
          begin
            nBytePos := (((nOffset div 8) + nSliceIndex) * 8) + nBit;
            nBitPos := (nBytePos * BMP.Width) + nCol;

            nTmpBit := 0;
            if (nBitPos < Length(ADots)) then
            begin
              if ADots[nBitPos] then
                nTmpBit := 1
              else
                nTmpBit := 0;
            end;
            nSlice := nSlice or (nTmpBit shl (7 - nBit));
          end;

          Result := Result + Chr(nSlice);
        end;
      end;

      inc(nOffset, BitsSlice);
      Result := Result + CRLF;
    end;
  finally
     ADots := nil;
  end;
end;

有人有解决方案或示例参考吗?

android delphi bluetooth firemonkey thermal-printer
2个回答
0
投票

您在

BitmapToStr()
中遇到的错误是您从未使用
Map
位图来
BMPData
BMP

将其添加到函数的开头:

bmp.Map(TMapAccess.Read, BMPData);
try
  ...

最后:

finally
  bmp.Unmap(BMPData);
end;

另一方面,您不需要

try..finally..end
块来确保正确清理
ADots
数组。


0
投票

我喜欢你的代码,但我无法让它工作,你能给我发送示例项目吗?

© www.soinside.com 2019 - 2024. All rights reserved.