Project1

标题: bitmap=>png 简版 [打印本页]

作者: SixRC    时间: 2015-8-9 22:35
标题: bitmap=>png 简版
本帖最后由 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 优化了汇编代码

RUBY 代码复制
  1. class Bitmap
  2.   #-------------------------------------------------------------------#
  3.   #借鉴dant所成
  4.   #当然 我也努力了 —_—||
  5.   #不 是很努力呢                         -By SixRC
  6.   #-------------------------------------------------------------------#
  7.   #用法为  bitmap.ToPng(filename)
  8.   #假如很追求速度的话 下面的第34行改成
  9.   #data2 = Zlib::Deflate.deflate(@bit_data,1)
  10.   #这样压缩速度会提高(约快一倍) 虽然文件会变大 那个数值可以是1-9 0是不压缩 但不骗你 很慢 因为 写入慢了
  11.   #-------------------------------------------------------------------#
  12.   #--------------------------获取数据头地址---------------
  13.   CWP = Win32API.new('user32.dll','CallWindowProc','ppiii','i')
  14.   GetAddr=[139,116,36,8,139,54,139,118,8,139,118,16,139,124,36,4,137,55,194,16,0].pack("C*")
  15.   def addr
  16.     s="\0"*4
  17.     CWP.call(GetAddr,s,object_id*2+16,0,0)
  18.     s.unpack("L")[0]
  19.   end
  20.   #--------------------------保存为png--------------------
  21.   D1="\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x0\x0\x0\xdIHDR"
  22.   D2="\x8\x6\x0\x0\x0"
  23.   D3="\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"
  24.   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*")
  25.   def ToPng(pl)
  26.     unless @kg
  27.       @addr=addr
  28.       @kg=[width].pack("N")+[height].pack("N")
  29.       c1="IHDR"+@kg+D2
  30.       @crc1=[Zlib.crc32(c1)].pack("N")
  31.       @bit_data="\0"*height*(width*4+1)
  32.     end
  33.     CWP.call(GetData,@bit_data,@addr,width,height)
  34.     data2 = Zlib::Deflate.deflate(@bit_data)
  35.     crc2=[Zlib.crc32("IDAT"+data2)].pack("N")
  36.     sod=[data2.length].pack("N")
  37.     File.open(pl,"w+b"){|i|i.write(D1+@kg+D2+@crc1+sod+"IDAT"+data2+crc2+D3)}
  38.   end
  39. end

假如对象是很大的bitmap
请使用:
code








作者: chd114    时间: 2015-8-9 22:45
那么这是一个截图脚本?
作者: SixRC    时间: 2015-8-9 22:47
chd114 发表于 2015-8-9 22:45
那么这是一个截图脚本?

ya 标题不是很直白吗...
作者: chd114    时间: 2015-8-9 22:50
SixRC 发表于 2015-8-9 05:47
ya 标题不是很直白吗...

我差点以为是别的什么用途的脚本···
作者: taroxd    时间: 2015-8-10 10:01
本帖最后由 taroxd 于 2015-8-10 10:13 编辑

全程机器码的感觉如何……

然后,在VA里,不同编码的字符串是不能+的

改成这样就是通用发布了:
  1. File.open(pl,"wb"){|i|i<<D1<<kg<<D2<<crc1<<sod<<'IDAT'<<data<<crc2<<D3}
复制代码

作者: 英顺的马甲    时间: 2015-8-10 11:21
机械码让人感觉不安全啊==
作者: SixRC    时间: 2015-9-27 11:19
单纯是更新示意
这样子算是最终版了
恩 就是这样
作者: fux2    时间: 2015-9-28 02:35
我觉得紫苏原来那个纯ruby版的已经很快了。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1