Project1
标题:
[XP/VX]将不足画面大小的远景图扩展至画面大小
[打印本页]
作者:
各种压力的猫君
时间:
2011-12-15 14:07
标题:
[XP/VX]将不足画面大小的远景图扩展至画面大小
本帖最后由 各种压力的猫君 于 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已紧急修正。
范例工程:
暂不提供
作者:
阿尔西斯的马甲
时间:
2011-12-18 10:05
不明白这脚本到底是什么用处
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1