| 赞 | 87 |
| VIP | |
| 好人卡 | |
| 积分 | 136 |
| 经验 | |
| 最后登录 | 2021-1-24 |
| 在线时间 | 2753 小时 |
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 回帖
- 705

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 SixRC 于 2017-10-16 20:18 编辑
借鉴了 @dant 的范本 获益匪浅 打算自己再写一个 于是就有了这个
相比他的版本 我精简了原有的东西 把取地址和取数据两块重写了 效率高了
不过保存一下小图是根本看不出来的....因为他的已经很快了
2015/9/26 更新一处地方 效率大大提高 汗
2015/9/27 发现不知为何用<<的话效率骤降 是和xp不兼容还是什么 别的版本没试过 所以依旧是xp发布
2015/9/30 发现要改还是有蛮多地方可以改的..这次节省了重复内容
2017/10/10 更新了保存大规格bitmap的脚本
2017/10/16 优化了汇编代码
[pre lang="ruby"]class Bitmap
#-------------------------------------------------------------------#
#借鉴dant所成
#当然 我也努力了 —_—||
#不 是很努力呢 -By SixRC
#-------------------------------------------------------------------#
#用法为 bitmap.ToPng(filename)
#假如很追求速度的话 下面的第34行改成
#data2 = Zlib::Deflate.deflate(@bit_data,1)
#这样压缩速度会提高(约快一倍) 虽然文件会变大 那个数值可以是1-9 0是不压缩 但不骗你 很慢 因为 写入慢了
#-------------------------------------------------------------------#
#--------------------------获取数据头地址---------------
CWP = Win32API.new('user32.dll','CallWindowProc','ppiii','i')
GetAddr=[139,116,36,8,139,54,139,118,8,139,118,16,139,124,36,4,137,55,194,16,0].pack("C*")
def addr
s="\0"*4
CWP.call(GetAddr,s,object_id*2+16,0,0)
s.unpack("L")[0]
end
#--------------------------保存为png--------------------
D1="\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x0\x0\x0\xdIHDR"
D2="\x8\x6\x0\x0\x0"
D3="\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"
GetData=[85,137,229,139,125,8,49,210,139,101,20,137,227,68,139,69,16,137,198,193,230,3,193,224,2,15,175,224,139,69,12,1,196,139,77,16,66,41,244,88,15,200,193,200,8,137,4,23,141,82,4,73,117,241,75,117,232,137,236,93,194,16,0].pack("C*")
def ToPng(pl)
unless @kg
@addr=addr
@kg=[width].pack("N")+[height].pack("N")
c1="IHDR"+@kg+D2
@crc1=[Zlib.crc32(c1)].pack("N")
@bit_data="\0"*height*(width*4+1)
end
CWP.call(GetData,@bit_data,@addr,width,height)
data2 = Zlib::Deflate.deflate(@bit_data)
crc2=[Zlib.crc32("IDAT"+data2)].pack("N")
sod=[data2.length].pack("N")
File.open(pl,"w+b"){|i|i.write(D1+@kg+D2+@crc1+sod+"IDAT"+data2+crc2+D3)}
end
end
[/pre]
假如对象是很大的bitmap
请使用:
code[pre lang="ruby"]#-------------------------------------------------------------------#
# 请运行两次exe
# 第一次是为了生成bitmap对象
# 第二次会读取第一次程序的内存防止内存崩溃
# 11行pl是保存的文件名 例子在下面
# 27行interval是每次保存的高度数 请根据图片大小自行调整 得小于图片高度
# -SixRC 2017.10.10 #
#-------------------------------------------------------------------#
if File.exist?("test.txt")
#ttt=Time.now
pl="t.png"
f=open("test.txt",'r').read.split("/")
gwtp=Win32API.new('user32','GetWindowThreadProcessId','lp','l')
op=Win32API.new('kernel32','OpenProcess','lll','l')
rpm=Win32API.new('kernel32','ReadProcessMemory','llpll','l')
hwnd=f[0].to_i
addr=f[1].to_i
width=f[2].to_i
height=f[3].to_i
s="\0"*4
gwtp.call(hwnd,s)
hw=op.call(2035711,0,s.unpack('l')[0])
CWP = Win32API.new('user32.dll','CallWindowProc','pppii','i')
GetData=[85,137,229,139,125,8,49,210,139,101,20,137,227,68,139,69,16,137,198,193,230,3,193,224,2,15,175,224,139,69,12,1,196,139,77,16,66,41,244,88,15,200,193,200,8,137,4,23,141,82,4,73,117,241,75,117,232,137,236,93,194,16,0].pack("C*")
gz=Zlib::GzipWriter.open("temp.gz",9)
xy=[]
interval=2500
adler = Zlib.adler32
for i in 0...height/interval
xy.unshift([interval*i,interval*(i+1)])
end
i+=1
xy.unshift([interval*i,height]) unless interval*i==height
for i in xy
gap=i[1]-i[0]
temp1="\0"*gap*(width*4)
temp2="\0"*gap*(width*4+1)
rpm.call(hw,addr+i[0]*width*4,temp1,width*4*gap,0)
CWP.call(GetData,temp2,temp1,width,gap)
adler=Zlib.adler32(temp2,adler)
gz.write(temp2)
Graphics.update
end
gz.close
fsize = File.size("temp.gz")
f = File.open("temp.gz", "rb")
f.pos = 10
data2 = "\170\332"
data2+=f.read(fsize - 18)
data2+=[adler].pack("N")
temp1=temp2=nil
D1="\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x0\x0\x0\xdIHDR"
D2="\x8\x6\x0\x0\x0"
D3="\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"
@kg=[width].pack("N")+[height].pack("N")
c1="IHDR"+@kg+D2
@crc1=[Zlib.crc32(c1)].pack("N")
crc2=[Zlib.crc32("IDAT"+data2)].pack("N")
sod=[data2.length].pack("N")
File.open(pl,"wb"){|i|i.write(D1+@kg+D2+@crc1+sod+"IDAT"+data2+crc2+D3)}
# p Time.now-ttt
exit
end
class Bitmap
CWP = Win32API.new('user32.dll','CallWindowProc','ppiii','i')
GetAddr=[139,116,36,8,139,54,139,118,8,139,118,16,139,124,36,4,137,55,194,16,0].pack("C*")
def addr
s="\0"*4
CWP.call(GetAddr,s,object_id*2+16,0,0)
s.unpack("L")[0]
end
end
#测试用图
#b=Bitmap.new(15000,15000)
#c=Bitmap.new("1.png")
#r=Rect.new(0,0,200,200)
#for i in 0..74
# for j in 0..74
# b.blt(i*200,j*200,c,r)
# end
#end
b=Bitmap.new("tt.png")
Hwnd=Win32API.new("user32", "GetActiveWindow", 'v', 'L').call
f=open("test.txt",'w')
f.write(Hwnd.to_s+"/"+b.addr.to_s+"/"+b.width.to_s+"/"+b.height.to_s)
f.close
loop{Graphics.update}[/pre]
|
|