设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4709|回复: 7
打印 上一主题 下一主题

[原创发布] bitmap=>png 简版

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2015-8-9 22:35:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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 优化了汇编代码

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







点评

@晴兰 不过我不会!我做的任何都绝对不是专业的!我还要慢慢进化!  发表于 2015-9-30 18:45
不用<<你可以用join。另外这种方式是我早期纯黑的产物。现在我们都有组织有纪律的黑了,可以用DSL来写这些机器码。  发表于 2015-9-30 02:40

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

2
 楼主| 发表于 2015-8-9 22:47:10 | 显示全部楼层
chd114 发表于 2015-8-9 22:45
那么这是一个截图脚本?

ya 标题不是很直白吗...
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

3
 楼主| 发表于 2015-9-27 11:19:13 | 显示全部楼层
单纯是更新示意
这样子算是最终版了
恩 就是这样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-13 19:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表