您现在看到的是 66RPG.com 的资源列表,若这些对您有帮助,
希望您以充值论坛VIP点数的方式为我们捐款,
您的捐款将用于本站的三台服务器托管费,以及网通100M带宽的租金

66RPG充值页面 66RPG充值页面

最近更新记录

  • 2012-02-14 : 新增两个音乐素材
  • 2012-02-14 : 新增一个游戏资源
  • 2012-02-10 : 新增3个素材资源
  • 2012-02-09 : 新增/更新16个资源

66RPG 站内搜索

精确(推荐) 全文

本站收集内容是为了便于让游戏制作爱好者互相学习与交流,所有内容的版权与著作权均归原作者/公司所有。如进行有可能引起纠纷的使用,建议您先与原作方沟通。
将Bitmap对象输出成PNG文件优化版
更新:2012-01-27 05:16:42 | 点击量:513
将Bitmap对象输出成PNG文件优化版
脚本作者:轮回者
版本更新:Ver 1.0
适用版本:RPG Maker XP、RPG Maker VX
将Bitmap对象输出成PNG文件优化版,上级者用

128m的机器2000*1000的图输出大约30s,
应该不会再出现“脚本已备份”了。
多谢66、金圭子和夏娜的提醒
现在主要是get_pixel的效率问题……管不了,不管了。
 

#==============================================================================
#               本脚本出自www.66rpg.com,转载请注明。
#==============================================================================
=begin
==============================================================================
                        Bitmap to PNG By 轮回者
==============================================================================
 对Bitmap对象直接使用
 
 bitmap_obj.make_png(name[, path])
 
 name:保存文件名
 path:保存路径
 感谢66、夏娜、金圭子的提醒和帮助!
   
==============================================================================
=end
module Zlib
  class Png_File < GzipWriter
    #--------------------------------------------------------------------------
    # ● 主处理
    #-------------------------------------------------------------------------- 
    def make_png(bitmap_Fx,mode)
      @mode = mode
      @bitmap_Fx = bitmap_Fx
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end
    #--------------------------------------------------------------------------
    # ● PNG文件头数据块
    #--------------------------------------------------------------------------
    def make_header
      return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
    end
    #--------------------------------------------------------------------------
    # ● PNG文件情报头数据块(IHDR)
    #-------------------------------------------------------------------------- 
    def make_ihdr
      ih_size = [13].pack("N")
      ih_sign = "IHDR"
      ih_width = [@bitmap_Fx.width].pack("N")
      ih_height = [@bitmap_Fx.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
    #--------------------------------------------------------------------------
    # ● 生成图像数据(IDAT)
    #-------------------------------------------------------------------------- 
    def make_idat
      header = "\x49\x44\x41\x54"
      case @mode # 请54~
      when 1
        data = make_bitmap_data#1
      else
        data = make_bitmap_data
      end
      data = Zlib::Deflate.deflate(data, 8)
      crc = [Zlib.crc32(header + data)].pack("N")
      size = [data.length].pack("N")
      return size + header + data + crc
    end
    #--------------------------------------------------------------------------
    # ● 从Bitmap对象中生成图像数据 mode 1(请54~)
    #-------------------------------------------------------------------------- 
    def make_bitmap_data1
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      return data.pack("C*")
    end
    #--------------------------------------------------------------------------
    # ● 从Bitmap对象中生成图像数据 mode 0
    #-------------------------------------------------------------------------- 
    def make_bitmap_data
      gz = Zlib::GzipWriter.open('hoge.gz')
      t_Fx = 0
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          t_Fx += 1
          if t_Fx % 10000 == 0
            Graphics.update
          end
          if t_Fx % 100000 == 0
            s = data.pack("C*")
            gz.write(s)
            data.clear
            #GC.start
          end
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      s = data.pack("C*")
      gz.write(s)
      gz.close    
      data.clear
      gz = Zlib::GzipReader.open('hoge.gz')
      data = gz.read
      gz.close
      File.delete('hoge.gz') 
      return data
    end
    #--------------------------------------------------------------------------
    # ● PNG文件尾数据块(IEND)
    #-------------------------------------------------------------------------- 
    def make_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
  end
end
#==============================================================================
# ■ Bitmap
#------------------------------------------------------------------------------
#  关联到Bitmap。
#==============================================================================
class Bitmap
  #--------------------------------------------------------------------------
  # ● 关联
  #-------------------------------------------------------------------------- 
  def make_png(name="like", path="",mode=0)
    make_dir(path) if path != ""
    Zlib::Png_File.open("temp.gz") {|gz|
      gz.make_png(self,mode)
    }
    Zlib::GzipReader.open("temp.gz") {|gz|
      $read = gz.read
    }
    f = File.open(path + name + ".png","wb")
    f.write($read)
    f.close
    File.delete('temp.gz') 
    end
  #--------------------------------------------------------------------------
  # ● 生成保存路径
  #-------------------------------------------------------------------------- 
  def make_dir(path)
    dir = path.split("/")
    for i in 0...dir.size
      unless dir == "."
        add_dir = dir[0..i].join("/")
        begin
          Dir.mkdir(add_dir)
        rescue
        end
      end
    end
  end
end
#==============================================================================
#               本脚本出自www.66rpg.com,转载请注明。
#==============================================================================

搜到一些相关内容,看看有没有有用的:

教程 : 物品颜色描绘脚本教程 : 浅谈动态菜单背景的制作教程 : 个性化商店教程 : RMVX升级提示教程 : 自定义多货币脚本教程 : VX呼出对话框教程 : 战斗AI脚本教程 : VX地图名自动显示教程 : VX双远景图系统(XP移植)教程 : 武器决定技能教程 : 得失物品金钱提示(云版)教程 : 美化战斗时候的角色选项窗口教程 : 华丽镜头移动脚本 VX化教程 : vx新菜单样式教程 : 跟隨光标自修正位置的详细帮助窗..教程 : 一些RGSS默认方法的简单扩展教程 : 叶子的详尽任务显示界面 vx版教程 : 游戏窗口中显示金钱教程 : VX用八方向走(可加速)教程 : rmvx时钟教程 : 去掉"逃跑" 将逃跑加入菜单选..教程 : VX版商店的价格变动教程 : 给装备附加多个自动状态教程 : 卡拉OK形式显示歌词教程 : VX开头画面特效教程 : VX使用单张头像图档教程 : 滚动字幕(从XP移植)教程 : 统一定义对话关键词颜色教程 : 敌人能力值自动设定教程 : 脚本小讲堂[4]

没找到你想要的?可以使用搜索功能 ↓

66RPG 站内搜索

精确(推荐) 全文

评论啦