delphi android 打印机,用delphi控制小票打印机打印图片
用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控制小票打印机打印图片相关推荐
- delphi android闪退,delphi 运行后闪退
我的delphi编完一段程序之后按F9可以运行,但是关掉并保存Delphi之后再打开Delphi然后打开之前那个编辑的程序按F9就直接闪退了. 程序如下: unit Unit1; interface ...
- delphi android动态权限,DELPHI安卓动态权限申请
DELPHI安卓动态权限申请 安卓8.0以前的版本,只需要给静态权限就可以了,但安卓8.0及以后的版本,还需要运行期用代码动态申请权限. 下面以<蓝牙权限>为例,其他权限类似. Delph ...
- delphi android 短信,delphi xe5 android 开发实现手机打电话和发短信
其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...
- 常见小票打印机打印故障及解决方法汇总视频教程
通过对"常见小票打印机故障及解决方法汇总视频教程"课程学习,达到以下目的:1.可以独立自主安装打印机驱动以及安装打印机硬件设备 2.可以独立自主排除常见打印机故障 学习教程 常见小 ...
- delphi控制POS打印机
delphi控制POS打印机 delphi控制POS打印机 RPrinter为TextFile类型: SContent为TStringList类型. // 建立打印连接并打印数据 Assignfile ...
- 硬件系列(五)-------------Android小票打印机连接 (已封装好,可直接使用)
一.新建MyUsbPrinterUtil工具类,代码如下: import android.annotation.SuppressLint; import android.app.PendingInte ...
- Uniapp Android 佳博 小票打印机 插件
Uniapp Android 佳博 小票打印机 插件 Uniapp Android 佳博小票打印机插件: 支持图片.条型码.二维码 打印. 1. 实例化插件 const gp= uni.requir ...
- Android 设备接入小票打印机 爱宝小票打印机
实现android 设备连接小票打印机打印小票的功能时,发现了一个好用的库:https://github.com/AlexMofer/ProjectX/tree/master/printer andr ...
- iOS开发之蓝牙/Socket链接小票打印机
原文链接:https://www.jianshu.com/p/3f36ae67f5a4 來源:简书 本文转载至简书的一位作者,如有侵权,请及时告知 前言 之前公司有个面向商户的项目,需要连接商户打印机 ...
最新文章
- Git 头指针分离与 FETCH_HEAD
- java虚拟机线程调优与底层原理分析_Java并发编程——多线程的底层原理
- Excel导入SQL数据库完整代码
- python二叉树深度 判断平衡树
- tomcat项目的ajax路径问题,Tomcat下ajax请求路径总结
- android刷新时的圆形动画_Android动画篇(一):圆形进度条CircleProgressBar
- 最后一战 源代码_我们的故事 | 一枚“铁渣”的一战成名
- java 打印数据_Java 中的打印流
- 如何判断IoC容器中是否存在指定Bean?
- Centos7 完全卸载mysql5.7
- postman自动化测试
- 联想笔记本重装系统,联想电脑安装系统
- 蓝桥杯c语言大一的知识够了吗,参加蓝桥杯后的感受以及个人总结
- 机器学习方向上还有没有创新点呢?
- 视频动作识别(Action Recognition)综述
- php表白情话,唯美表白情话短句 八字古风情话
- 机器学习系列(三)——EM算法
- 你可以成为测试界的李子柒
- linux内核编译的实质
- android微信群聊功能,微信安卓内测更新,这个群聊功能等了8年