赞 | 4 |
VIP | 211 |
好人卡 | 175 |
积分 | 7 |
经验 | 48096 |
最后登录 | 2014-1-9 |
在线时间 | 1327 小时 |
Lv2.观梦者 (?????)
- 梦石
- 0
- 星屑
- 723
- 在线时间
- 1327 小时
- 注册时间
- 2011-7-18
- 帖子
- 3184
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 各种压力的猫君 于 2011-12-15 14:33 编辑
根据VX讨论区问题制作:http://rpg.blue/thread-214013-2-1.html
使用了轮回者的输出Bitmap到Png脚本,在此表示感谢。
[Ntec]Bitmap2Png v1.0 第一部分(输出Btimap到Png)- #==============================================================================
- # ■ [Ntec]Bitmap2Png v1.0
- #------------------------------------------------------------------------------
- # 将Bitmap输出为Png图片。
- #-------------------------------------------------------------------------------
- # 更新作者: 各种压力的猫君
- # 原始作者: 轮回者(协力:柳之一)
- # 使用协议: Ntec 支援层脚本
- # RGSS版本: RGSS/RGSS2 (Rpg Maker XP/VX)
- #-------------------------------------------------------------------------------
- # 更新记录:
- # ◇2011-12-15 v 1.0 by 各种压力的猫君
- # └在原始版本基础上加以修改以适应NEKO_tec脚本内部调用;
- # ◆2008-06-14 v 0.0 by 轮回者 (feat 柳之一)
- # └原始版本;
- #-------------------------------------------------------------------------------
- # 插入位置:
- # 尽可能靠近脚本编辑器脚本列表顶端。
- # 使用说明:
- # NEKO_tec 支援层脚本,内部调用。
- #===============================================================================
- #-------------------------------------------------------------------------------
- # ▼ Ntec 通用配置模块
- #-------------------------------------------------------------------------------
- module Ntec
- module Bitmap2Png
- # 版本号
- VERSION = 1.0
- end
- end
- #==============================================================================
- # PNG文件输出
- # 用法:bitmap.save2png(filename)
- # BY:轮回者
- #==============================================================================
- class Bitmap
-
- # 是否自动颠倒上下?
- # false时输出图像上下会颠倒,但并不能节省很多时间
- SWITCH_UP2DOWN = true
-
- # 存入PNG文件
- def save2png(filename)
- file = File.open(filename,"wb")
- file.write(make_png_header)
- file.write(make_png_ihdr)
- file.write(make_png_idat)
- file.write(make_png_iend)
- file.close
- end
-
- # PNG文件头数据块
- def make_png_header
- return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
- end
- # PNG文件情报头数据块(IHDR)
- def make_png_ihdr
- ih_size = [13].pack("N")
- ih_sign = "IHDR"
- ih_width = [width].pack("N")
- ih_height = [height].pack("N")
- ih_bit_depth = [8].pack("C")
- ih_color_type = [6].pack("C")
- ih_compression_method = [0].pack("C")
- ih_filter_method = [0].pack("C")
- ih_interlace_method = [0].pack("C")
- string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
- ih_compression_method + ih_filter_method + ih_interlace_method
- ih_crc = [Zlib.crc32(string)].pack("N")
- return ih_size + string + ih_crc
- end
-
- # PNG图像数据(IDAT)
- def make_png_idat
- header = "\x49\x44\x41\x54"
- data = SWITCH_UP2DOWN ? make_png_data : make_png_data2
- data = Zlib::Deflate.deflate(data, 8)
- crc = [Zlib.crc32(header + data)].pack("N")
- size = [data.length].pack("N")
- return size + header + data + crc
- end
-
- # PNG图像数据(点阵);自动颠倒上下
- def make_png_data
- data = get_data.unpack('x2aX2aX2ax2a'*height*width).to_s
- len = width * 4
- for y in 0...height
- break if 2*y >= height - 1
- nth1 = y * len
- nth2 = (height - 1 - y) * len
- tStr = data[nth1,len]
- data[nth1, len] = data[nth2, len]
- data[nth2, len] = tStr
- end
-
- for y in 0...height
- nth = (height - 1 - y) * width * 4
- data.insert(nth,"\000")
- end
- return data
- end
-
- # PNG图像数据(点阵);不自动颠倒上下
- def make_png_data2
- data = get_data.unpack('x2aX2aX2ax2a'*height*width).to_s
- for y in 0...height
- nth = (height - 1 - y) * width * 4
- data.insert(nth,"\000")
- end
- return data
- end
-
- # PNG文件尾数据块(IEND)
- def make_png_iend
- ie_size = [0].pack("N")
- ie_sign = "IEND"
- ie_crc = [Zlib.crc32(ie_sign)].pack("N")
- return ie_size + ie_sign + ie_crc
- end
-
- # 获取数据
- def get_data
- data = "rgba" * width * height
- RtlMoveMemory_pi.call(data, address, data.length)
- return data
- end
- end
- #==============================================================================
- # Bitmap类修改尝试
- #==============================================================================
- class Bitmap
- # 取得点(x,y)的颜色(Color)
- def get_pixel_plus(x, y)
- data = "rgba"
- nth = ((height - 1 - y) * width + x) * data.length
- RtlMoveMemory_pi.call(data, address + nth, data.length)
- clr_ary = data.unpack('c*')
- return Color.new(clr_ary[2],clr_ary[1],clr_ary[0],clr_ary[3])
- end
-
- # 设定点(x,y)的颜色为 color(Color)
- def set_pixel_plus(x, y, color)
- data = [color.blue,color.green,color.red,color.alpha].pack('c*')
- nth = ((height - 1 - y) * width + x) * data.length
- RtlMoveMemory_ip.call(address + nth, data, data.length)
- return self
- end
- end
- #==============================================================================
- # 快速存储Bitmap的Marshal(修改版)By 柳之一
- #==============================================================================
- class Font
- def marshal_dump;end
- def marshal_load(obj);end
- end
- class Bitmap
- attr_accessor :address
-
- # API
- RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
- RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
-
- # Save
- def _dump(limit)
- data = "rgba" * width * height
- RtlMoveMemory_pi.call(data, address, data.length)
- [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # 压缩
- end
-
- # Read
- def self._load(str)
- w, h, zdata = str.unpack("LLa*"); b = new(w, h)
- RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4); b
- end
-
- def address
- @address = ini_address if @address.nil?
- return @address
- end
-
- def ini_address
- buffer, ad = "xxxx", object_id * 2 + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
- RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0]
- return ad
- end
- end
- #-------------------------------------------------------------------------------
- # ■ End of Script
- # 本脚本来自66RPG.com Script form 66RPG.com.
- # 严禁用于商业用途 Mustn't be used for commercial/business purpose.
- # 转载请保留此信息 Keep this message when repost.
- #-------------------------------------------------------------------------------
复制代码 [Ntec]Para_Expander v1.1 第二部分(本体)- #==============================================================================
- # ■ [Ntec]Para_Expander (Parallaxes_expander) v1.1
- #------------------------------------------------------------------------------
- # 将比画面小的远景图居中扩充到画面大小。(在四周添加边框)
- # 四周边框的颜色由原图左上角第一个像素的颜色决定。
- #-------------------------------------------------------------------------------
- # 脚本作者: 各种压力的猫君
- # 使用协议: 严禁用于商业用途
- # RGSS版本: RGSS/RGSS2 (Rpg Maker XP/VX)
- # 必需脚本: [Ntec]Bitmap2Png v 1.0 以上(原始脚本 by 轮回者 feat 柳之一)
- #-------------------------------------------------------------------------------
- # 更新记录:
- # ◇2011-12-15 v1.1 by 各种压力的猫君
- # └紧急修正backup目录不存在时报错(现在可以自动生成目录);
- # ◇2011-12-15 v1.0 by 各种压力的猫君
- # └初版;
- #-------------------------------------------------------------------------------
- # 插入位置:
- # 必需脚本之下,尽可能靠近脚本编辑器脚本列表顶端。
- # 若要修改分辨率,请在本脚本之前修改。
- # 使用方法:
- # ※请先在通用配置模块中配置相应设定※
- # 运行游戏即可,执行过程中会弹出提示窗口。
- # 成功执行本脚本之后请在通用配置模块中关掉开关或删除本脚本。
- # 脚本说明:
- # 支持的输入格式有png、bmp、jpg,但都会被输出为png。
- # 原始文件会被移动到远景图目录下的backup文件夹中。
- # 本脚本为双远景辅助用脚本,其他情况用处不大。
- #===============================================================================
- #-------------------------------------------------------------------------------
- # ▼ Ntec 通用配置模块
- #-------------------------------------------------------------------------------
- module Ntec
- module Para_Expander
-
- # 远景图目录(为空时自动获取,若未修改默认目录请留空)
- dir = ""
-
- # 画面分辨率(为0时自动获取,若未对默认分辨率做修改此处请保留0)
- screen_width = 0 # 宽度(如需指定请同时指定高度)
- screen_height = 0 # 高度(如需指定请同时指定宽度)
-
- "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
- "┃ [Ntec] 自定义内容到此结束,以下内容切勿随意修改 ┃"
- "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
- # 检测运行环境
- if RUBY_VERSION == "1.9.2"
- print "检测到当前运行环境为RGSS3 (Rpg Maker VX Ace)\n" +
- "\n本脚本暂不支持此运行环境\n" +
- "\n按确定键退出"
- exit
- end
- if defined? $TEST
- DIR = "Graphics/Parallaxes/" unless dir != ""
- if screen_width != 0 and screen_height != 0
- SW = screen_width
- SH = screen_height
- else
- SW = Graphics.width
- SH = Graphics.height
- end
- print "检测到当前运行环境为RGSS2 (Rpg Maker VX)\n" +
- "\n分辨率设置为:" + SW.to_s + "×" + SH.to_s + "\n" +
- "远景目录设置为:" + DIR.to_s
- else
- DIR = "Graphics/Panoramas/" unless dir != ""
- if screen_width != 0 and screen_height != 0
- SW = screen_width
- SH = screen_height
- else
- SW = 640
- SH = 480
- end
- print "检测到当前运行环境为RGSS (Rpg Maker XP)" +
- "\n分辨率设置为:" + SW.to_s + "×" + SH.to_s + "\n" +
- "远景目录设置为:" + DIR.to_s
- end
- # 版本号
- VERSION = 1.0
- # 错误时操作
- ON_ERROR = "exit"
- # 检测必需脚本
- unless defined? Ntec::Bitmap2Png::VERSION and
- Ntec::Bitmap2Png::VERSION >= 1.0
- print "必需脚本[Ntec]Bitmap2Png不存在或版本过低。"
- eval Ntec::Para_Expander::ON_ERROR
- end
- end
- end
- #-------------------------------------------------------------------------------
- # ▼ Parallaxes_expander Class
- #-------------------------------------------------------------------------------
- class Parallaxes_expander
-
- #--------------------------------------------------------------------------
- # ● 初始化:检测远景图,存入数组
- #--------------------------------------------------------------------------
-
- def initialize
- # 检测远景图,存入数组
- @pnglist = Dir.glob(Ntec::Para_Expander::DIR + "*.png")
- @bmplist = Dir.glob(Ntec::Para_Expander::DIR + "*.bmp")
- @jpglist = Dir.glob(Ntec::Para_Expander::DIR + "*.jpg")
- if @pnglist.size + @bmplist.size + @jpglist.size == 0
- print "没有检测到远近图文件,请确认远景图目录设置正确。"
- eval Ntec::Para_Expander::ON_ERROR
- else
- print "检测到以下格式远景图:\n" +
- @pnglist.size.to_s + "个png格式远景图\n" +
- @bmplist.size.to_s + "个bmp格式远景图\n" +
- @jpglist.size.to_s + "个jpg格式远景图\n" +
- "\n按确定键开始分析 (step 1 of 2)"
- # 转到扫描bitmap尺寸
- scan_bitmap_size
- end
- end
-
- #--------------------------------------------------------------------------
- # ● 扫描bitmap尺寸
- #--------------------------------------------------------------------------
-
- def scan_bitmap_size
- # 初始化数组
- @do_list = []
- # 初始化计数器
- count = 0
- # 处理png格式
- for png in @pnglist
- temp_bitmap = Bitmap.new(png)
- if temp_bitmap.width < Ntec::Para_Expander::SW or
- temp_bitmap.height < Ntec::Para_Expander::SH
- # 压入数组
- @do_list.push png
- end
- temp_bitmap.dispose
- # 计数器进位
- count += 1
- # 每处理20次回收内存,防止内存溢出
- if count % 20 == 0
- GC.start
- end
- end
- # 处理bmp格式
- for bmp in @bmplist
- temp_bitmap = Bitmap.new(bmp)
- if temp_bitmap.width < Ntec::Para_Expander::SW or
- temp_bitmap.height < Ntec::Para_Expander::SH
- # 压入数组
- @do_list.push bmp
- end
- temp_bitmap.dispose
- # 计数器进位
- count += 1
- # 每处理20次回收内存,防止内存溢出
- if count % 20 == 0
- GC.start
- end
- end
- # 处理jpg格式
- for jpg in @jpglist
- temp_bitmap = Bitmap.new(jpg)
- if temp_bitmap.width < Ntec::Para_Expander::SW or
- temp_bitmap.height < Ntec::Para_Expander::SH
- # 压入数组
- @do_list.push jpg
- end
- temp_bitmap.dispose
- # 计数器进位
- count += 1
- # 每处理20次回收内存,防止内存溢出
- if count % 20 == 0
- GC.start
- end
- end
- # 转到处理bitmap
- print "检测到需要处理的远景图" + @do_list.size.to_s + "张\n" +
- "\n处理过程将花费较长时间,请耐心等待。\n" +
- "处理过程中请务必确保本窗口为激活状态,若失去焦点将暂停处理。\n" +
- "\n按确定键开始处理 (step 2 of 2)"
- expand_bitmap
- end
-
- #--------------------------------------------------------------------------
- # ● 扩展bitmap
- #--------------------------------------------------------------------------
-
- def expand_bitmap
- # 记录现在时间
- @begin_time = Time.now
- # 生成底Bitmap
- expanded_width = Ntec::Para_Expander::SW
- expanded_height = Ntec::Para_Expander::SH
- @expanded_bitmap = Bitmap.new(expanded_width, expanded_height)
- @expanded_rect = @expanded_bitmap.rect
- # 初始化计数器
- count = 0
- @count = 0
- # 主循环,处理bitmap
- for bitmap in @do_list
- # 读入待处理bitmap
- small_bitmap = Bitmap.new(bitmap)
- small_width = small_bitmap.width
- small_height = small_bitmap.height
- src_rect = small_bitmap.rect
- small_x = (expanded_width - small_width) / 2
- small_y = (expanded_height - small_height) /2
- # 生成输出bitmap
- new_bitmap = @expanded_bitmap.clone
- expanded_color = small_bitmap.get_pixel(0, 0)
- new_bitmap.fill_rect(@expanded_rect, expanded_color)
- new_bitmap.blt(small_x, small_y, small_bitmap, src_rect)
- # 储存bitmap
- save_bitmap(new_bitmap, bitmap)
- new_bitmap.dispose
- # 计数器进位
- count += 1
- # 每处理20次回收内存,防止内存溢出
- if count % 20 == 0
- GC.start
- end
- end
- # 转到处理完成
- expand_done
- end
-
- #--------------------------------------------------------------------------
- # ● 储存bitmap
- #--------------------------------------------------------------------------
-
- def save_bitmap(bitmap, filename)
- # 生成文件名
- dirname = File.dirname(filename)
- basename = File.basename(filename)
- savename = File.basename(filename, ".*")
- backupdir = dirname + "/backup/"
- backupname = backupdir + basename
- createname = dirname + "/" + savename + ".png"
- # 生成备份目录
- Dir.mkdir(backupdir) unless FileTest.exist?(backupdir)
- # 备份原文件
- File.rename(filename, backupname)
- # 储存新文件
- bitmap.save2png(createname)
- # 计数器进位
- @count += 1
- end
- #--------------------------------------------------------------------------
- # ● 处理完成
- #--------------------------------------------------------------------------
-
- def expand_done
- time = Time.now - @begin_time
- print "处理完成\n共处理:" + @count.to_s + "张远景图,\n" +
- "耗时:" + time.to_s + "秒\n" +
- "\n 按确定键退出"
- exit
- end
-
- end
- #-------------------------------------------------------------------------------
- # ▼ Run Script
- #-------------------------------------------------------------------------------
- Parallaxes_expander.new
- #-------------------------------------------------------------------------------
- # ■ End of Script
- # 本脚本来自66RPG.com Script form 66RPG.com.
- # 严禁用于商业用途 Mustn't be used for commercial/business purpose.
- # 转载请保留此信息 Keep this message when repost.
- #-------------------------------------------------------------------------------
复制代码 使用说明:
将第一个脚本放置于脚本编辑器顶端,第二个脚本放置于其下,保存并运行游戏即可。
生成完毕后删除两个脚本即可。
紧急修正:
请手工在远景图目录下新建backup文件夹,否则脚本可能报错。
↑v1.1已紧急修正。
范例工程:
暂不提供 |
|