用delphi控制小票打印机打印图片

unit PosPrintBmp;

{***********************************************************************}

{ 单元名称:PosPrintBmp  小票打印机打印图片的类  }

{  }

{ 创建人:李红雷  }

{ 日期:2012.2  }

{ 修改人:  }

{ 日期:  }

{ 功能:GetDocument函数 得到图片的字节数组  }

{  属性ByteLen 得到字节数组的长度  }

{ 用法: PosPrintBmp := TPosPrintBmp.Create(FPicName);

}

{  try  }

{  PrintPic := PosPrintBmp.GetDocument;

}

{  gLen

:= PosPrintBmp.ByteLen;  }

{  WritePrinter(hprinter, @PrintPic, gLen, N);

}

{  finally

}

{  PosPrintBmp.Free;  }

{  end;  }

{***********************************************************************}

interface

uses

Windows, SysUtils, Classes, Graphics,

jpeg;

const

Nul: Char = #0;

FormFeed: Char = #12;

Escape: Char = #27;

Newline: Char = #10;

GroupSeparator: Char = #29;

HorizontalTab: Char = #9;

CarriageReturn: Char = #13;

Cancel: Char = #24;

DataLinkEscape: Char = #16;

EndOfTransmission: Char = #4;

FileSeparator: Char = #28;

Sat: Char = #64; //@

Sv: Char = #86;  //V

S66: Char = #66;

S3: Char = #51;

Sx: Char = #42;  //*

S24: Char = #24;

S33: Char = #33;

S30: Char = #30;

S3_1: Char = #3;

type

TData = packed record

Dots: array of

Boolean;

Height, Width:

Integer;

end;

TPosPrintBmp = class(TObject)

private

FLen: Integer;

FPicName: string;

function

GetBitmapData(PicName: string): TData;

procedure RenderLogo(out

fms: TMemoryStream);

public

constructor Create(const

AFileName: string);

function GetDocument:

TByteArray;  //得到图片的字节数组

published

property ByteLen: Integer

read FLen;  //字节数组的长度

end;

implementation

constructor TPosPrintBmp.Create(const AFileName: string);

begin

inherited Create;

FPicName := AFileName;

end;

function TPosPrintBmp.GetBitmapData(PicName: string): TData;

const

threshold: Integer = 127;

var

Bmp: TBitmap;

index, dimensions, x, y, luminance:

Integer;

dots: array of Boolean;

AData: TData;

RGB: TColor;

RC, GC, BC: Byte;

jpeg: TJPEGImage;

begin

index := 0;

Bmp := TBitmap.Create;

try

if

UpperCase(ExtractFileExt(PicName)) = '.JPG' then

begin

jpeg :=

TJPEGImage.Create;

try

jpeg.LoadFromFile(PicName);

Bmp.Assign(jpeg);

finally

jpeg.Free;

end

end else

Bmp.LoadFromFile(PicName);

dimensions := Bmp.Width *

Bmp.Height;

SetLength(dots,

dimensions);

for y := 0 to Bmp.Height -

1 do

begin

for x

:= 0 to Bmp.Width - 1 do

begin

RGB := Bmp.Canvas.Pixels[x, y];

RC := RGB and $FF;

GC := RGB and $FF00 shr 8;

BC := RGB and $FF0000 shr 16;

luminance := Round(RC * 0.3 + GC * 0.59 + BC *

0.11);

dots[index] := (luminance <

threshold);

Inc(index);

end;

end;

finally

AData.Height :=

Bmp.Height;

AData.Width :=

Bmp.Width;

SetLength(AData.Dots,

Length(dots));

Move(dots[0],

AData.Dots[0], Length(dots));

Bmp.Free;

end;

Result := AData;

end;

procedure TPosPrintBmp.RenderLogo(out fms: TMemoryStream);

var

Data: TData;

FDots: array of Boolean;

offset, I, K, b, x, y, tmpint, M:

Integer;

v: Boolean;

slice: Byte;

FWidth: array of Byte;

begin

Data := GetBitmapData(FPicName);

SetLength(FDots, Length(Data.Dots));

Move(Data.Dots[0], FDots[0],

Length(Data.Dots));

SetLength(FWidth, 4);

FWidth[0] := Data.Width and $FF;

FWidth[1] := Data.Width and $FF00 shr 8;

FWidth[2] := Data.Width and $FF0000 shr

16;

FWidth[3] := Data.Width and $FF000000 shr

24;

fms.Write(Newline, 1);

fms.Write(Escape, 1);

fms.Write(s3, 1);

fms.Write(S24, 1);

offset := 0;

OutputDebugString(PChar('offset=' +

IntToStr(offset)));

while (offset < Data.Height)

do

begin

fms.Write(Escape, 1);

fms.Write(Sx, 1);

// bit-image mode

fms.Write(S33, 1);

// 24-dot double-density

fms.Write(FWidth[0], 1);

// width low byte

fms.Write(FWidth[1], 1);

// width high byte

for x := 0 to data.Width -

1 do

begin

for K

:= 0 to 2 do

begin

slice := 0;

for b := 0 to 7 do

begin

y := (((offset div 8) + k) *

8) + b;

i := (y * data.Width) +

x;

v := False;

if (I <

Length(Data.Dots)) then

v :=

FDots[I];

tmpint := 7 - b;

if v then

M := 1 shl

tmpint

else

M := 0 shl

tmpint;

slice := slice or M;

end;

fms.Write(slice, 1);

end;

end;

Inc(offset, 24);

if offset <

Data.Height then // 去掉结束空行

fms.Write(Newline, 1);

end;

// Restore the line spacing to the default of

30 dots.

fms.Write(Escape, 1);

fms.Write(S3, 1);

fms.Write(S30, 1);

end;

function TPosPrintBmp.GetDocument: TByteArray;

var

ms: TMemoryStream;

TmpBA: TByteArray;

begin

ms := TMemoryStream.Create;

try

ms.Write(Escape, 1);

ms.Write(Sat, 1);

RenderLogo(ms);

//ms.Write(GroupSeparator,

1);

//ms.Write(Sv, 1);

//ms.Write(S66, 1);

//ms.Write(S3_1, 1);

ms.Write(Newline, 1);

ms.Position := 0;

FLen := ms.Size;

ms.ReadBuffer(TmpBA[0],

ms.Size);

finally

ms.Free;

end;

Result := TmpBA;

end;

end.

delphi android 打印机,用delphi控制小票打印机打印图片相关推荐

  1. delphi android闪退,delphi 运行后闪退

    我的delphi编完一段程序之后按F9可以运行,但是关掉并保存Delphi之后再打开Delphi然后打开之前那个编辑的程序按F9就直接闪退了. 程序如下: unit Unit1; interface ...

  2. delphi android动态权限,DELPHI安卓动态权限申请

    DELPHI安卓动态权限申请 安卓8.0以前的版本,只需要给静态权限就可以了,但安卓8.0及以后的版本,还需要运行期用代码动态申请权限. 下面以<蓝牙权限>为例,其他权限类似. Delph ...

  3. delphi android 短信,delphi xe5 android 开发实现手机打电话和发短信

    其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...

  4. 常见小票打印机打印故障及解决方法汇总视频教程

    通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安装打印机驱动以及安装打印机硬件设备 2.可以独立自主排除常见打印机故障 学习教程 常见小 ...

  5. delphi控制POS打印机

    delphi控制POS打印机 delphi控制POS打印机 RPrinter为TextFile类型: SContent为TStringList类型. // 建立打印连接并打印数据 Assignfile ...

  6. 硬件系列(五)-------------Android小票打印机连接 (已封装好,可直接使用)

    一.新建MyUsbPrinterUtil工具类,代码如下: import android.annotation.SuppressLint; import android.app.PendingInte ...

  7. Uniapp Android 佳博 小票打印机 插件

    Uniapp Android 佳博 小票打印机 插件 Uniapp Android 佳博小票打印机插件:  支持图片.条型码.二维码 打印. 1. 实例化插件 const gp= uni.requir ...

  8. Android 设备接入小票打印机 爱宝小票打印机

    实现android 设备连接小票打印机打印小票的功能时,发现了一个好用的库:https://github.com/AlexMofer/ProjectX/tree/master/printer andr ...

  9. iOS开发之蓝牙/Socket链接小票打印机

    原文链接:https://www.jianshu.com/p/3f36ae67f5a4 來源:简书 本文转载至简书的一位作者,如有侵权,请及时告知 前言 之前公司有个面向商户的项目,需要连接商户打印机 ...

最新文章

  1. Git 头指针分离与 FETCH_HEAD
  2. java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理
  3. Excel导入SQL数据库完整代码
  4. python二叉树深度 判断平衡树
  5. tomcat项目的ajax路径问题,Tomcat下ajax请求路径总结
  6. android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar
  7. 最后一战 源代码_我们的故事 | 一枚“铁渣”的一战成名
  8. java 打印数据_Java 中的打印流
  9. 如何判断IoC容器中是否存在指定Bean?
  10. Centos7 完全卸载mysql5.7
  11. postman自动化测试
  12. 联想笔记本重装系统,联想电脑安装系统
  13. 蓝桥杯c语言大一的知识够了吗,参加蓝桥杯后的感受以及个人总结
  14. 机器学习方向上还有没有创新点呢?
  15. 视频动作识别(Action Recognition)综述
  16. php表白情话,唯美表白情话短句 八字古风情话
  17. 机器学习系列(三)——EM算法
  18. 你可以成为测试界的李子柒
  19. linux内核编译的实质
  20. android微信群聊功能,微信安卓内测更新,这个群聊功能等了8年

热门文章

  1. 人机测试计算机,人机测试
  2. 自定义 rest_framework 响应返回格式
  3. 8通道CAN FD,更强大的数据记录仪GL3400
  4. pageX,clientX区别
  5. 苹果无需越狱了!通过苹果签名轻松安装IPA文件
  6. 更新包与已安装应用的签名不一致
  7. 怎样解决PHP中文乱码问题
  8. 导航栏: UINavigationBar用法
  9. Android系统的心脏-Zygote进程启动流程分析
  10. 5e显示非vac服务器,CSGO出现VAC无法验证的解决方法