本文整理自网络,侵删。
介绍
简单说明一下,运行后先点chmod然后点start,5秒存一张图,保存在/sdcard/mybmp下,当前仅支持800*480横屏的。需要别的分辨率的,请自行修改myscreensavetostream过程代码。
主要的截屏代码:
首先创建一个图片的流,然后将图片流做为参数传递到截屏函数中,最后保存成文件
procedure TForm1.Timer1Timer(Sender: TObject);
var
memstrm:TMemoryStream;
buf:array of Byte;
intobuf:array of integer;
begin
fileid:=fileid+1;
memstrm:=TMemoryStream.Create();
memstrm.Position:=0;
myscreensavetostream(memstrm);
memstrm.SaveToFile('/sdcard/mybmp/'+IntToStr(fileid)+'.bmp');
memstrm.Free();
end;
下面是截屏的代码
procedure myscreensavetostream(Stream:TMemoryStream);
var
offset:integer;
btmapbuf:array of Byte;
intobuf:array of integer;
strm:TFileStream;
FileHeader : TBitmapFileHeader;
InfoHeader : TBitmapInfoHeader;
HeaderLen,n : Integer;
mybmp:TBitmap;
begin
strm:=TFileStream.Create('/dev/graphics/fb0',fmOpenRead);
SetLength(btmapbuf,1536000);
setLength(intobuf,384000);
strm.Position:=0;
strm.Read(btmapbuf[0],1536000);
offset:=0;
while offset<Length(intobuf)do
begin
intobuf[offset]:=btmapbuf[4*offset]+btmapbuf[4*offset+1]*256+btmapbuf[4*offset+2]*65536+btmapbuf[4*offset+3]*16777216;
offset:=offset+1;
end;
//初始化文件头
HeaderLen:=SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader);
with FileHeader,InfoHeader do
begin
bfType:=$4D42;
bfSize:=1536000+HeaderLen; //self.FSize+HeaderLen
bfReserved1:=0;
bfReserved2:=0;
bfOffBits:=HeaderLen;
biSize:=SizeOf(TBitmapInfoHeader);
biWidth:=800; //Width
biHeight:=480; //Height
biPlanes:=1;
biBitCount:=32;
biCompression:=0; //BI_RGB
biSizeImage:=1536000; //self.FSize
biXPelsPerMeter:=$EC4;
biYPelsPerMeter:=$EC4;
biClrUsed:=0;
biClrImportant:=0;
end;
//写入数据
n:=0;
n:=n+Stream.Write(FileHeader,SizeOf(TBitmapFileHeader));
n:=n+Stream.Write(InfoHeader,SizeOf(TBitmapInfoHeader));
n:=n+Stream.Write(intobuf[0],1536000); //n:=n+Stream.Write((self.FBits)^,self.FSize);
//result:=n=(1536000+HeaderLen); //result:=n=(self.FSize+HeaderLen);
mybmp:=TBitmap.Create;
mybmp.LoadFromStream(Stream);
mybmp.FlipVertical;
Stream.Clear();
Stream.Position:=0;
mybmp.SaveToStream(Stream);
SetLength(btmapbuf,0);
setLength(intobuf,0);
strm.Free();
end;
相关阅读 >>
Delphi实现win10下Delphi 10.3.1 inline hook 域名转向之internetconnecta
Delphi win10系统通知 notificationcenter1 基本用法
Delphi 如何把一个exe做为res加入到dll中,并在运行时生成exe文件执行
更多相关阅读请进入《Delphi》频道 >>