查看: 2342|回复: 5

[已经解决] 半生的Bitmap脚本第231行报错

[复制链接]
梦石
0
星屑
1014
在线时间
173 小时
注册时间
2014-3-22
回帖
9
发表于 2015-12-27 16:35:39 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 alicediary 于 2015-12-27 16:35 编辑

[pre lang="ruby"]# 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::       http://www.tktkgame.com/

################更新########################
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
[/pre]

没有使用计时器前还可以正常运行,但使用计时器后脚本就报错显示为这个样子
求大神能告诉我是哪里出错了,谢谢
百度截图201512271632.jpg

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-12-27 20:48:52 | 显示全部楼层
据说把【LARGE_BITMAP = true】改成false可以解决……
回复

使用道具 举报

梦石
0
星屑
1014
在线时间
173 小时
注册时间
2014-3-22
回帖
9
 楼主| 发表于 2015-12-28 17:52:30 | 显示全部楼层
cinderelmini 发表于 2015-12-27 20:48
据说把【LARGE_BITMAP = true】改成false可以解决……

不行诶,将【LARGE_BITMAP = true】改为false后Cache第106行又报错了

点评

你这样问题可能描述的不是很清楚,最好的方法就是你上传一个简单的小范例上来。别人好帮你找问题。  发表于 2015-12-28 18:15
回复

使用道具 举报

梦石
0
星屑
1014
在线时间
173 小时
注册时间
2014-3-22
回帖
9
 楼主| 发表于 2015-12-28 19:51:58 | 显示全部楼层
http://pan.baidu.com/s/1jHj6z9G←范例(网盘链接添加不了只能这样了)
回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-12-28 21:27:42 | 显示全部楼层
hhhhh……原来是这样……
是文件格式的问题,把行走图文件夹里面的【$imgbb4fc157b2b5773.sai】转成换成png就好了。
提个小小的建议吧,
就是说psd或者sai什么的,要么别跟要使用的png或者jpg之类格式的文件同名,要么在名字后面格式名前面加上标志,
比如【$imgbb4fc157b2b5773-sai.sai】这样,避免读到同名的rm无法识别的格式,
或者另建一个文件夹把psd、sai什么的塞进去…………

评分

参与人数 1星屑 +233 收起 理由
taroxd + 233 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
1014
在线时间
173 小时
注册时间
2014-3-22
回帖
9
 楼主| 发表于 2015-12-29 19:02:05 | 显示全部楼层
真的可以了,万分感谢(。◕∀◕。)
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部