赞 | 86 |
VIP | 0 |
好人卡 | 1 |
积分 | 136 |
经验 | 14048 |
最后登录 | 2021-1-24 |
在线时间 | 2753 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 帖子
- 756
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 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 优化了汇编代码
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
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
假如对象是很大的bitmap
请使用:
code
|
|