Delphi XE5开发的Android手机截屏功能


本文整理自网络,侵删。

 介绍


简单说明一下,运行后先点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 qq尾巴病毒的编写

Delphi 对非活动窗口进行屏幕截图

Delphi 检查ip地址合法性

Delphi 控制台程序加图标方法

Delphi 和微软的 azure 云存储

Delphi 程序运行提示 “database login”对话框,让输入adoconnection1 的username和password

Delphi api �c multibytetowidechar的用法

Delphi imagelist-图片(bmp)按名称而不按索引

Delphi 遍例一个外部程序中所有的类名

Delphi 判断一个颜色是否是亮色

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    暂无评论...