赞 | 16 |
VIP | 0 |
好人卡 | 0 |
积分 | 10 |
经验 | 6859 |
最后登录 | 2024-6-24 |
在线时间 | 171 小时 |
Lv3.寻梦者
- 梦石
- 0
- 星屑
- 974
- 在线时间
- 171 小时
- 注册时间
- 2014-3-22
- 帖子
- 14
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 alicediary 于 2015-12-27 16:35 编辑
# coding: utf-8 =begin = Bitmap类拡张 (DLL版) RPGツクールXP/VX/VA共用 添加功能 Bitmap 类。 - Marshaldump 启用 - 保存为PNG文件 -色调变化 -马赛克效果 -反相颜色 -模糊效果 -使用遮罩-切除 -混合 ■ 注意 这个脚本需要"tktk_bitmap.dll"(ver0.1.2.6以上)。 Author:: 半生 Date:: 2010/12/13 Version:: 0.1.2.6 URL:: [url]http://www.tktkgame.com/[/url] ################更新######################## 2010/12/13 ver 0.1.2.6 dll名称从"hn_rg_bitmap.dll"变更为"tktk_bitmap.dll" LARGE_BITMAP机能でメモリを确保できなかった场合の処理を追加 2010/10/12 ver 0.1.2.5(デンジャラスベータ版) 大きいサイズのBitmapオブジェクトを机能を试験的に実装(危険) 2010/03/24 ver 0.1.2.2 ブレンディング机能関连の軽量化。 画像连结系メソッドの分离。 2010/03/24 ver 0.1.2.1 ブレンディング机能関连のバグフィックス 2010/03/22 ver 0.1.2.0 加算合成等のブレンディング机能の追加 2010/02/07 ver 0.1.1.0 マーシャル化の処理の一部をDLLに移动 2010/01/17 ver 0.1.0.0 dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更 モザイク効果・色反転・ぼかし効果の追加 ############################################ =end module TKTK_Bitmap LARGE_BITMAP = true # 是否使用大型点阵图的功能 DLL_NAME = 'tktk_bitmap' ERROR_ALLOCATE_FAILED = -110002 @@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i') @@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i') @@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i') @@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i') @@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i') @@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i') @@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n') @@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i') @@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i') @@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i') #@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l') @@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i') module_function # PNG形式储存 def png_save(bitmap,file_name,compression_level,filter) return @@png_save.call(file_name, bitmap.object_id, compression_level, filter) end # 模糊效果 def blur(bitmap, r = 1) return @@blur.call(bitmap.object_id, r) end # 更改颜色平衡? def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1) return @@change_tone.call(bitmap.object_id, red, green, blue, simplify) end # 剪贴蒙版图像(α乘法) def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0) return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer) end # 色的反转 def invert(bitmap) return @@invert.call(bitmap.object_id) end # 马赛克效果 def mosaic(bitmap, msw=5, msh=5) return self.mosaic_rect(bitmap, bitmap.rect, msw, msh) end # 马赛克效果(范围指定) def mosaic_rect(bitmap, rect, msw=5, msh=5) return @@mosaic.call(bitmap.object_id, rect.x, rect.y, rect.width, rect.height, msw, msh) end # 获取Bitmap资料位址 def address(bitmap) return @@address.call(bitmap.object_id) end # 二进位资料获取点Bitmap阵图 def get_pixel_data(bitmap) buffer = "bgra" * bitmap.width * bitmap.height @@get_pixel_data.call(bitmap.object_id, buffer, buffer.size) return buffer end #替换为Bitmap中的二进位资料 def set_pixel_data(bitmap, data) return @@set_pixel_data.call(bitmap.object_id, data, data.size) end def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255) @@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id, rect.x, rect.y, rect.width, rect.height, blend_type, opacity) end # 改变Bitmap的大小(风险) def change_size(bitmap, new_width, new_height) return -1 if (new_width <=0 or new_height <= 0) result = @@change_size.call(bitmap.object_id, new_width, new_height) if result == ERROR_ALLOCATE_FAILED raise("tktk_bitmap:ERROR ALLOCATE FAILED") end return result end end class Font def marshal_dump;end def marshal_load(obj);end end class Bitmap # PNG 压缩筛检程式 PNG_NO_FILTERS = 0x00 PNG_FILTER_NONE = 0x08 PNG_FILTER_SUB = 0x10 PNG_FILTER_UP = 0x20 PNG_FILTER_AVG = 0x40 PNG_FILTER_PAETH = 0x80 PNG_ALL_FILTERS = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | PNG_FILTER_AVG | PNG_FILTER_PAETH) # Marshal_dump def _dump(limit) return "" if self.disposed? data = TKTK_Bitmap.get_pixel_data(self) [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧缩 end # Marshal_load def self._load(str) if str == "" b = Bitmap.new(1,1) b.dispose return b end w, h, zdata = str.unpack("LLa*"); b = new(w, h) TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata)) return b end def address TKTK_Bitmap.address(self) end # 模糊效果 def blur2(r=1) TKTK_Bitmap.blur(self, r) end # 色调变化 def change_tone(red, green, blue, simplify = 1) TKTK_Bitmap.change_tone(self, red, green, blue, simplify) end # 剪切 def clip_mask(bitmap, x=0, y=0, outer=0) TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer) end # 反相颜色 def invert TKTK_Bitmap.invert(self) end # 马赛克效果 def mosaic(msw=5, msh=5) TKTK_Bitmap.mosaic(self, msw, msh) end # 马赛克效果 (指定区域) def mosaic_rect(rect=self.rect, msw=5, msh=5) TKTK_Bitmap.mosaic_rect(self, rect, msw, msh) end # 混合 def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255) return if opacity <= 0 TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity) end #Png 格式保存 def png_save(outp, level = 9, filter = PNG_NO_FILTERS) if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0) raise("Bitmap\#png_save failed") end end # 允许更大的 bitmap.new (危険) # 宽度 * 高度大约是1073741823 if TKTK_Bitmap::LARGE_BITMAP class << self unless method_defined?(:_hn_large_bm__new) alias :_hn_large_bm__new :new end def new(*args) if args.size == 2 && args[0] * args[1] >= 4194304 new_width = args[0] new_height = args[1] # 暂时以小尺寸作成 bitmap = _hn_large_bm__new(16, 16) TKTK_Bitmap.change_size(bitmap, new_width, new_height) return bitmap else _hn_large_bm__new(*args) end end end # Bitmap.new end end # CLASS Bitmap
# coding: utf-8
=begin
= Bitmap类拡张 (DLL版)
RPGツクールXP/VX/VA共用
添加功能 Bitmap 类。
- Marshaldump 启用
- 保存为PNG文件
-色调变化
-马赛克效果
-反相颜色
-模糊效果
-使用遮罩-切除
-混合
■ 注意
这个脚本需要"tktk_bitmap.dll"(ver0.1.2.6以上)。
Author:: 半生
Date:: 2010/12/13
Version:: 0.1.2.6
URL:: [url]http://www.tktkgame.com/[/url]
################更新########################
2010/12/13 ver 0.1.2.6
dll名称从"hn_rg_bitmap.dll"变更为"tktk_bitmap.dll"
LARGE_BITMAP机能でメモリを确保できなかった场合の処理を追加
2010/10/12 ver 0.1.2.5(デンジャラスベータ版)
大きいサイズのBitmapオブジェクトを机能を试験的に実装(危険)
2010/03/24 ver 0.1.2.2
ブレンディング机能関连の軽量化。
画像连结系メソッドの分离。
2010/03/24 ver 0.1.2.1
ブレンディング机能関连のバグフィックス
2010/03/22 ver 0.1.2.0
加算合成等のブレンディング机能の追加
2010/02/07 ver 0.1.1.0
マーシャル化の処理の一部をDLLに移动
2010/01/17 ver 0.1.0.0
dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更
モザイク効果・色反転・ぼかし効果の追加
############################################
=end
module TKTK_Bitmap
LARGE_BITMAP = true # 是否使用大型点阵图的功能
DLL_NAME = 'tktk_bitmap'
ERROR_ALLOCATE_FAILED = -110002
@@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i')
@@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i')
@@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i')
@@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i')
@@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i')
@@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i')
@@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n')
@@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i')
@@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i')
@@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i')
#@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l')
@@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i')
module_function
# PNG形式储存
def png_save(bitmap,file_name,compression_level,filter)
return @@png_save.call(file_name, bitmap.object_id, compression_level, filter)
end
# 模糊效果
def blur(bitmap, r = 1)
return @@blur.call(bitmap.object_id, r)
end
# 更改颜色平衡?
def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1)
return @@change_tone.call(bitmap.object_id, red, green, blue, simplify)
end
# 剪贴蒙版图像(α乘法)
def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0)
return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer)
end
# 色的反转
def invert(bitmap)
return @@invert.call(bitmap.object_id)
end
# 马赛克效果
def mosaic(bitmap, msw=5, msh=5)
return self.mosaic_rect(bitmap, bitmap.rect, msw, msh)
end
# 马赛克效果(范围指定)
def mosaic_rect(bitmap, rect, msw=5, msh=5)
return @@mosaic.call(bitmap.object_id,
rect.x, rect.y, rect.width, rect.height, msw, msh)
end
# 获取Bitmap资料位址
def address(bitmap)
return @@address.call(bitmap.object_id)
end
# 二进位资料获取点Bitmap阵图
def get_pixel_data(bitmap)
buffer = "bgra" * bitmap.width * bitmap.height
@@get_pixel_data.call(bitmap.object_id, buffer, buffer.size)
return buffer
end
#替换为Bitmap中的二进位资料
def set_pixel_data(bitmap, data)
return @@set_pixel_data.call(bitmap.object_id, data, data.size)
end
def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255)
@@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id,
rect.x, rect.y, rect.width, rect.height,
blend_type, opacity)
end
# 改变Bitmap的大小(风险)
def change_size(bitmap, new_width, new_height)
return -1 if (new_width <=0 or new_height <= 0)
result = @@change_size.call(bitmap.object_id, new_width, new_height)
if result == ERROR_ALLOCATE_FAILED
raise("tktk_bitmap:ERROR ALLOCATE FAILED")
end
return result
end
end
class Font
def marshal_dump;end
def marshal_load(obj);end
end
class Bitmap
# PNG 压缩筛检程式
PNG_NO_FILTERS = 0x00
PNG_FILTER_NONE = 0x08
PNG_FILTER_SUB = 0x10
PNG_FILTER_UP = 0x20
PNG_FILTER_AVG = 0x40
PNG_FILTER_PAETH = 0x80
PNG_ALL_FILTERS = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
PNG_FILTER_AVG | PNG_FILTER_PAETH)
# Marshal_dump
def _dump(limit)
return "" if self.disposed?
data = TKTK_Bitmap.get_pixel_data(self)
[width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧缩
end
# Marshal_load
def self._load(str)
if str == ""
b = Bitmap.new(1,1)
b.dispose
return b
end
w, h, zdata = str.unpack("LLa*"); b = new(w, h)
TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata))
return b
end
def address
TKTK_Bitmap.address(self)
end
# 模糊效果
def blur2(r=1)
TKTK_Bitmap.blur(self, r)
end
# 色调变化
def change_tone(red, green, blue, simplify = 1)
TKTK_Bitmap.change_tone(self, red, green, blue, simplify)
end
# 剪切
def clip_mask(bitmap, x=0, y=0, outer=0)
TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer)
end
# 反相颜色
def invert
TKTK_Bitmap.invert(self)
end
# 马赛克效果
def mosaic(msw=5, msh=5)
TKTK_Bitmap.mosaic(self, msw, msh)
end
# 马赛克效果 (指定区域)
def mosaic_rect(rect=self.rect, msw=5, msh=5)
TKTK_Bitmap.mosaic_rect(self, rect, msw, msh)
end
# 混合
def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255)
return if opacity <= 0
TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity)
end
#Png 格式保存
def png_save(outp, level = 9, filter = PNG_NO_FILTERS)
if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0)
raise("Bitmap\#png_save failed")
end
end
# 允许更大的 bitmap.new (危険)
# 宽度 * 高度大约是1073741823
if TKTK_Bitmap::LARGE_BITMAP
class << self
unless method_defined?(:_hn_large_bm__new)
alias :_hn_large_bm__new :new
end
def new(*args)
if args.size == 2 && args[0] * args[1] >= 4194304
new_width = args[0]
new_height = args[1]
# 暂时以小尺寸作成
bitmap = _hn_large_bm__new(16, 16)
TKTK_Bitmap.change_size(bitmap, new_width, new_height)
return bitmap
else
_hn_large_bm__new(*args)
end
end
end # Bitmap.new
end
end # CLASS Bitmap
没有使用计时器前还可以正常运行,但使用计时器后脚本就报错显示为这个样子
求大神能告诉我是哪里出错了,谢谢 |
|