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

Project1

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

[原创发布] PNG文件输出[发布预备]

 关闭 [复制链接]

Lv2.观梦者


  • 更新完成啦

梦石
0
星屑
799
在线时间
6267 小时
注册时间
2006-6-7
帖子
8462
跳转到指定楼层
1
发表于 2008-6-14 05:05:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  1. #==============================================================================
  2. # PNG文件输出
  3. #   用法:bitmap.save2png(filename)
  4. # BY:轮回者
  5. #==============================================================================

  6. class Bitmap  
  7.   
  8.   # 是否自动颠倒上下?
  9.   #   false时输出图像上下会颠倒,但并不能节省很多时间
  10.   SWITCH_UP2DOWN = true
  11.   
  12.   # 存入PNG文件
  13.   def save2png(filename)
  14.     file = File.open(filename,"wb")
  15.     file.write(make_png_header)
  16.     file.write(make_png_ihdr)
  17.     file.write(make_png_idat)
  18.     file.write(make_png_iend)
  19.     file.close
  20.   end
  21.   
  22.   # PNG文件头数据块
  23.   def make_png_header
  24.     return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  25.   end

  26.   # PNG文件情报头数据块(IHDR)
  27.   def make_png_ihdr
  28.     ih_size = [13].pack("N")
  29.     ih_sign = "IHDR"
  30.     ih_width = [width].pack("N")
  31.     ih_height = [height].pack("N")
  32.     ih_bit_depth = [8].pack("C")
  33.     ih_color_type = [6].pack("C")
  34.     ih_compression_method = [0].pack("C")
  35.     ih_filter_method = [0].pack("C")
  36.     ih_interlace_method = [0].pack("C")
  37.     string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
  38.             ih_compression_method + ih_filter_method + ih_interlace_method
  39.     ih_crc = [Zlib.crc32(string)].pack("N")
  40.     return ih_size + string + ih_crc
  41.   end
  42.   
  43.   # PNG图像数据(IDAT)
  44.   def make_png_idat
  45.     header = "\x49\x44\x41\x54"
  46.     data = SWITCH_UP2DOWN ? make_png_data : make_png_data2
  47.     data = Zlib::Deflate.deflate(data, 8)
  48.     crc = [Zlib.crc32(header + data)].pack("N")
  49.     size = [data.length].pack("N")
  50.     return size + header + data + crc
  51.   end
  52.   
  53.   # PNG图像数据(点阵);自动颠倒上下
  54.   def make_png_data
  55.     data = get_data.unpack('x2aX2aX2ax2a'*height*width).to_s
  56.     len = width * 4      
  57.     for y in 0...height
  58.       break if 2*y >= height - 1
  59.       nth1 = y * len      
  60.       nth2 = (height - 1 - y) * len      
  61.       tStr = data[nth1,len]      
  62.       data[nth1, len] = data[nth2, len]      
  63.       data[nth2, len] = tStr
  64.     end
  65.    
  66.     for y in 0...height
  67.       nth = (height - 1 - y) * width * 4
  68.       data.insert(nth,"\000")
  69.     end
  70.     return data
  71.   end
  72.   
  73.   # PNG图像数据(点阵);不自动颠倒上下
  74.   def make_png_data2
  75.     data = get_data.unpack('x2aX2aX2ax2a'*height*width).to_s
  76.     for y in 0...height
  77.       nth = (height - 1 - y) * width * 4
  78.       data.insert(nth,"\000")
  79.     end
  80.     return data
  81.   end  
  82.   
  83.   # PNG文件尾数据块(IEND)
  84.   def make_png_iend
  85.     ie_size = [0].pack("N")
  86.     ie_sign = "IEND"
  87.     ie_crc = [Zlib.crc32(ie_sign)].pack("N")
  88.     return ie_size + ie_sign + ie_crc
  89.   end
  90.   
  91.   # 获取数据
  92.   def get_data
  93.     data = "rgba" * width * height
  94.     RtlMoveMemory_pi.call(data, address, data.length)
  95.     return data
  96.   end
  97. end

  98. #==============================================================================
  99. # Bitmap类修改尝试
  100. #==============================================================================

  101. class Bitmap
  102.   # 取得点(x,y)的颜色(Color)
  103.   def get_pixel_plus(x, y)
  104.     data = "rgba"
  105.     nth = ((height - 1 - y) * width + x) * data.length
  106.     RtlMoveMemory_pi.call(data, address + nth, data.length)   
  107.     clr_ary = data.unpack('c*')
  108.     return Color.new(clr_ary[2],clr_ary[1],clr_ary[0],clr_ary[3])
  109.   end
  110.   
  111.   # 设定点(x,y)的颜色为 color(Color)
  112.   def set_pixel_plus(x, y, color)
  113.     data = [color.blue,color.green,color.red,color.alpha].pack('c*')
  114.     nth = ((height - 1 - y) * width + x) * data.length
  115.     RtlMoveMemory_ip.call(address + nth, data, data.length)
  116.     return self
  117.   end
  118. end

  119. #==============================================================================
  120. # 快速存储Bitmap的Marshal(修改版)By 柳之一
  121. #==============================================================================
  122. class Font
  123.   def marshal_dump;end
  124.   def marshal_load(obj);end
  125. end

  126. class Bitmap
  127.   attr_accessor :address
  128.   # 初始化传送到内存的API函数
  129.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  130.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  131.   
  132.   # 保存
  133.   def _dump(limit)
  134.     data = "rgba" * width * height
  135.     RtlMoveMemory_pi.call(data, address, data.length)
  136.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # 压缩
  137.   end
  138.   
  139.   # 读取
  140.   def self._load(str)
  141.     w, h, zdata = str.unpack("LLa*"); b = new(w, h)
  142.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4); b
  143.   end
  144.   
  145.   # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  146.   #
  147.   def address
  148.     @address = ini_address if @address.nil?
  149.     return @address
  150.   end
  151.   
  152.   def ini_address
  153.     buffer, ad = "xxxx", object_id * 2 + 16
  154.     RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
  155.     RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
  156.     RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0]
  157.     return ad
  158.   end
  159. end

  160. #==============================================================================
  161. # 回收站~
  162. #==============================================================================

  163. =begin
  164. class Color_Plus
  165.   # 初始化实例变量
  166.   attr_accessor :red
  167.   attr_accessor :green
  168.   attr_accessor :blue
  169.   attr_accessor :alpha

  170.   # 初始化
  171.   def initialize(red, green, blue, alpha=255)
  172.     @red   = red
  173.     @green = green
  174.     @blue  = blue
  175.     @alpha = alpha
  176.   end
  177.   
  178.   # 设定所有属性
  179.   def set(red, green, blue, alpha=255)
  180.     @red   = red
  181.     @green = green
  182.     @blue  = blue
  183.     @alpha = alpha
  184.   end
  185. end
  186. =end

复制代码
用到了某柳的东西,感觉轮子这个还是不错的{/hx}

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

2
发表于 2008-6-14 17:53:56 | 只看该作者
和小夏的那个制作PNG很像啊~不过支持~{/qiang}
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

3
发表于 2008-6-18 03:59:06 | 只看该作者
优化的什么?
速度?


快速存储Bitmap的Marshal(修改版)By 66
版权有错,是柳之一哦 {/hx}
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-29
帖子
826
4
发表于 2008-6-22 00:11:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1624
在线时间
1609 小时
注册时间
2007-8-28
帖子
3253

第3届短篇游戏大赛主流游戏组冠军第1届Title华丽大赛新人奖

5
发表于 2008-6-22 09:35:22 | 只看该作者
以下引用Infrared于2008-6-21 16:11:26的发言:

很多解密方法输出图片的核心都是轮回者的PNG文件输出脚本,把PNG输出部份改成了这个之后,速度快了1倍。原本30MB游戏要20-30分钟。

#============================================================================
# *** RGSSAD Extractor version 1.02, created by vgvgf
#============================================================================
*** RGSSAD Extraction - Started at 21/06/2008(d/m/y) 15:46:41
* Sprites founded inside the scripts - Total 68
省略

*** RGSSAD Extraction - Finished at 21/06/2008(d/m/y) 16:04:24 - Extraction time 00:11:58




[本贴由作者于 2008-6-21 16:12:18 最后编辑]



哈哈,你也这么用啦。原来都用在邪恶的地方。

夏娜的png输出造成了rm无密可加的状态。难道要我自己写加密啊,太麻烦,解密的就好了。{/hx}
“我推荐你一个游戏吧,avg的,剧情特感人”
“我擦,都是文字图片的游戏有啥好玩的,连个战斗都没有!”
“我推荐你一个游戏吧,rpg的,战斗也新颖”
“我擦,怎么米有作i弊器?“
”你不是喜欢战斗么?”
“不,我是剧情党!!”

继续阅读请点击
http://rpg.blue/blog-53316-10027.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
6
发表于 2008-6-22 20:16:02 | 只看该作者
哈哈,你也这么用啦。原来都用在邪恶的地方。

夏娜的png输出造成了rm无密可加的状态。难道要我自己写加密啊,太麻烦,解密的就好了。

写吧写吧 偶以后用= =啊哈哈- -``
RMXP&RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

7
发表于 2008-6-22 20:28:41 | 只看该作者
以下引用灼眼的夏娜于2008-6-22 12:16:02的发言:



哈哈,你也这么用啦。原来都用在邪恶的地方。

夏娜的png输出造成了rm无密可加的状态。难道要我自己写加密啊,太麻烦,解密的就好了。


写吧写吧 偶以后用= =啊哈哈- -``

也?
消失百年的人出现了 {/fd}
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1030
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

8
发表于 2008-6-27 21:44:59 | 只看该作者
偶然發現自己居然還有發布和加VIP的權限 = =
發布完畢,VIP += 3
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

9
发表于 2008-6-27 21:56:19 | 只看该作者
虽然自己也想写个~不过这个脚本确实很好~很实用~很方便 省得自己写的麻烦了
又见小夏回帖~{/jy}
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
68 小时
注册时间
2007-12-16
帖子
75
10
发表于 2008-7-6 06:47:34 | 只看该作者
这是直接调用内存输出PNG的
直接把内存的点阵资料转存
因为一次就把全部的点阵信息输出了
所以效率比一点一点的读快多了

我之前有尝试过
但就苦在不知如何对内存的资料解码

话说有个有趣的事
内存的图是上下颠倒的耶
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 08:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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