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实现win10下Delphi 10.3.1 inline hook 域名转向之internetconnecta

Delphi一个简单的穿墙下载者

Delphi closefile 关闭文件

Delphi中简单的调用单元unit实例

Delphi 图像翻转

Delphi indy smtp 发送邮件

Delphi win10系统通知 notificationcenter1 基本用法

Delphi 字符串分割

Delphi 如何把一个exe做为res加入到dll中,并在运行时生成exe文件执行

Delphi sysutils.wraptext - 换行

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



打赏

取消

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

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

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

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

评论

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