赞 | 4 |
VIP | 211 |
好人卡 | 175 |
积分 | 7 |
经验 | 48096 |
最后登录 | 2014-1-9 |
在线时间 | 1327 小时 |
Lv2.观梦者 (?????)
- 梦石
- 0
- 星屑
- 723
- 在线时间
- 1327 小时
- 注册时间
- 2011-7-18
- 帖子
- 3184
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 各种压力的猫君 于 2012-2-1 20:15 编辑
高效率的DLL请见板凳,配合使用的脚本请见地面(6R你就不能老老实实给我用楼层号么233)
本脚本意在拓展思路,效率较差基本不具实用性。
(原图分辨率使用PS降低至1200*900,测试缩放倍数横纵均为0.3)
0 pass:RM默认算法(最邻近插值)
1 pass:双线性插值
2 pass:重复两次双线性插值
4 pass:重复四次双线性插值
下面是脚本:- #==============================================================================
- # ■ Bilinear_Zoom 1.0
- #------------------------------------------------------------------------------
- # 双线性插值图像缩放算法
- # by:各种压力的猫君 鸣谢:wbsy8241
- #------------------------------------------------------------------------------
- # 使用方法:
- # Bilinear_Zoom.new(bitmap, x_rate, y_rate, pass, type)
- # - bitmap 待缩放Bitmap
- # - x_rate 横轴放大率(支持小数)
- # - y_rate 纵轴放大率(支持小数)
- # - pass = 0 采用RM默认算法(测试用)
- # = 1 处理1次(默认)
- # = 2 处理2次(质量提升,用时翻倍)
- # = 4 处理4次(质量再提升,用时再翻倍)
- # - type = 1 计算Red、Green、Blue、Alpha(默认,有透明度)
- # = 0 计算Red、Green、Blue,Alpha = 255(速度较快,无透明度)
- #------------------------------------------------------------------------------
- # 脚本说明:
- # 本脚本意在拓展思路,效率较差基本不具实用性。
- # 所需时间和缩放后图片大小成正比,在RMXP上使用时可能存在“10s备份”问题。
- # 全局变量 $bilinear_time 记录处理用时 $bilinear_pass 记录所用pass。
- #------------------------------------------------------------------------------
- # 更新记录:
- # 1.0 2011-12-31 初版
- #==============================================================================
- class Bilinear_Zoom < Bitmap
- #--------------------------------------------------------------------------
- # ● 初始化对像
- #--------------------------------------------------------------------------
- def initialize(bitmap, x_rate, y_rate, pass = 1, type = 1)
- # 记录目前时间,用于统计算法用时
- @time_begin = Time.now
- # 记录全局变量(测试用)
- $bilinear_pass = pass
- # 读入参数
- @pass = pass
- @type = type
- @bitmap = bitmap
- # 若pass0采用RM默认算法
- if @pass == 0
- # 获取放大率
- @x_rate = x_rate
- @y_rate = y_rate
- # 获取原Bitmap及宽高信息
- @old_width = @bitmap.width
- @old_height = @bitmap.height
- # 根据放大率计算新Bitmap尺寸
- @new_width = (@old_width * @x_rate).ceil
- @new_height = (@old_height * @y_rate).ceil
- # 生成Bitmap
- super(@new_width, @new_height)
- # 缩放
- stretch_blt(self.rect, @bitmap, @bitmap.rect)
- else # 双线性插值
- case @pass
- when 1
- # 获取放大率
- @x_rate = x_rate
- @y_rate = y_rate
- when 2
- # 计算每pass放大率
- @x_rate = Math.sqrt(x_rate)
- @y_rate = Math.sqrt(y_rate)
- when 4
- # 计算每pass放大率
- @x_rate = Math.sqrt(Math.sqrt(x_rate))
- @y_rate = Math.sqrt(Math.sqrt(y_rate))
- end
- # 绘制Bitmap
- loop do
- break if @pass == 0
- # 获取原Bitmap及宽高信息
- @old_width = @bitmap.width
- @old_height = @bitmap.height
- # 根据放大率计算新Bitmap尺寸
- @new_width = (@old_width * @x_rate).ceil
- @new_height = (@old_height * @y_rate).ceil
- # 生成Bitmap
- super(@new_width, @new_height)
- # 缩放处理
- draw(@bitmap)
- # 循环(多pass)
- @pass -= 1
- @bitmap = self.clone
- end
- end
- # 记录全局变量(测试用)
- $bilinear_time = Time.now - @time_begin
- end
- #--------------------------------------------------------------------------
- # ● 绘制Bitmap
- #--------------------------------------------------------------------------
- def draw(bitmap)
- # 计算用宽高
- @math_width = @new_width + @x_rate.ceil
- @math_height = @new_height + @y_rate.ceil
- # 生成一个储存所有像素颜色的Table(3维数组)
- @color_table = Table.new(@old_width, @old_height, 4)
- # 每行从左到右的顺序依次获取颜色并压入Table
- for line in 0..(@old_height - 1)
- for row in 0..(@old_width - 1)
- @temp_color = bitmap.get_pixel(row, line)
- @color_table[row, line, 0] = @temp_color.alpha unless @type == 0
- @color_table[row, line, 1] = @temp_color.red
- @color_table[row, line, 2] = @temp_color.green
- @color_table[row, line, 3] = @temp_color.blue
- end
- end
- # 一行一行绘制
- for line in 0..(@new_height - 1)
- # 过程1:获取本行通用浮点y坐标
- do_math_1(line)
- for row in 0..(@new_width - 1)
- # 过程2:获取浮点x坐标
- do_math_2(row)
- # 过程3:获取颜色
- do_math_3
- # 过程4:计算颜色
- do_math_4
- # 后处理(预留模块)
- post_treatment
- # 绘制颜色
- draw_color(row, line)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 计算(过程1:获取y坐标及y权)
- #--------------------------------------------------------------------------
- def do_math_1(y)
- # 获取坐标
- temp = y * @old_height
- @ty1 = temp / @math_height
- @ty2 = @ty1 + 1
- # 获取权
- @py2 = temp % @math_height * 100 / @math_height
- @py1 = 100 - @py2
- end
- #--------------------------------------------------------------------------
- # ● 计算(过程2:获取x坐标及x权)
- #--------------------------------------------------------------------------
- def do_math_2(x)
- # 获取坐标
- temp = x * @old_width
- @tx1 = temp / @math_width
- @tx2 = @tx1 + 1
- # 获取权
- @px2 = temp % @math_width * 100 / @math_width
- @px1 = 100 - @px2
- end
- #--------------------------------------------------------------------------
- # ● 计算(过程3:获取颜色)
- #--------------------------------------------------------------------------
- def do_math_3
- # 获取四点颜色对应的权
- @p11 = @px1 * @py1
- @p21 = @px2 * @py1
- @p12 = @px1 * @py2
- @p22 = @px2 * @py2
- # 从Table中获取颜色
- unless @type == 0
- @c11_a = @color_table[@tx1, @ty1, 0]
- @c21_a = @color_table[@tx2, @ty1, 0]
- @c12_a = @color_table[@tx1, @ty2, 0]
- @c22_a = @color_table[@tx2, @ty2, 0]
- end
- @c11_r = @color_table[@tx1, @ty1, 1]
- @c21_r = @color_table[@tx2, @ty1, 1]
- @c12_r = @color_table[@tx1, @ty2, 1]
- @c22_r = @color_table[@tx2, @ty2, 1]
- @c11_g = @color_table[@tx1, @ty1, 2]
- @c21_g = @color_table[@tx2, @ty1, 2]
- @c12_g = @color_table[@tx1, @ty2, 2]
- @c22_g = @color_table[@tx2, @ty2, 2]
- @c11_b = @color_table[@tx1, @ty1, 3]
- @c21_b = @color_table[@tx2, @ty1, 3]
- @c12_b = @color_table[@tx1, @ty2, 3]
- @c22_b = @color_table[@tx2, @ty2, 3]
- end
- #--------------------------------------------------------------------------
- # ● 计算(过程4:计算颜色)
- #--------------------------------------------------------------------------
- def do_math_4
- @a = (@c11_a * @p11 + @c21_a * @p21 + @c12_a * @p12 + @c22_a * @p22) / 10000 unless @type == 0
- @r = (@c11_r * @p11 + @c21_r * @p21 + @c12_r * @p12 + @c22_r * @p22) / 10000
- @g = (@c11_g * @p11 + @c21_g * @p21 + @c12_g * @p12 + @c22_g * @p22) / 10000
- @b = (@c11_b * @p11 + @c21_b * @p21 + @c12_b * @p12 + @c22_b * @p22) / 10000
- end
- #--------------------------------------------------------------------------
- # ● 后处理(预留模块)
- #--------------------------------------------------------------------------
- def post_treatment
- unless @type == 0
- @color = @temp_color.set(@r, @g, @b, @a)
- else
- @color = @temp_color.set(@r, @g, @b)
- end
- # 预留
- end
- #--------------------------------------------------------------------------
- # ● 绘制颜色
- #--------------------------------------------------------------------------
- def draw_color(x, y)
- set_pixel(x, y, @color)
- end
- end
复制代码 天知道这效率差的要死的玩意有啥用 ╮(╯_╰)╭
用8pass的话(也就是再开一次平方)显然会更平滑,
但是因为双线性插值的特性会产生不可避免的模糊。 orz君帮忙搬到C++了……效率可谓质变……
(原图 4021×6050 缩放倍数 0.125)
RGSS3采用1pass耗时近1分钟,
C++采用4pass耗时刚过半秒…… |
评分
-
查看全部评分
|