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 winapi: movewindow - 改变窗口的位置与大小

Delphi idhttp超时重定向

Delphi 通过注册表获取系统版本和cpu型号

Delphi 如何将颜色值转换为灰度颜色值?

Delphi 在tedit中显示水印提示

Delphi 强制删除文件 zwdeletefile

Delphi dcc32.exe 参数说明

Delphi 数据异或校验

Delphi2009之timage

Delphi image1 图像复制到剪切板

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



打赏

取消

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

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

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

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

评论

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