- 累计送礼:
- 0 个
- 累计收礼:
- 0 个
TA的每日心情 | 开心 5 小时前 |
---|
签到天数: 114 天 连续签到: 4 天 [LV.6]常住居民II

管理员
  
- VIP
- 6
- 卡币
- 10607
- OK点
- 16
- 推广点
- 0
- 同能卷
- 0
- 积分
- 13376


|
- #==============================================================================# 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 endend#==============================================================================# 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 endend#==============================================================================# 快速存储Bitmap的Marshal(修改版)By 柳之一#==============================================================================class Font def marshal_dump;end def marshal_load(obj);endendclass Bitmap attr_accessor :address # 初始化传送到内存的API函数 RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i') RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i') # 保存 def _dump(limit) data = "rgba" * width * height RtlMoveMemory_pi.call(data, address, data.length) [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # 压缩 end # 读取 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 # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头 # 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 endend#==============================================================================# 回收站~#===============================================================================beginclass Color_Plus # 初始化实例变量 attr_accessor :red attr_accessor :green attr_accessor :blue attr_accessor :alpha # 初始化 def initialize(red, green, blue, alpha=255) @red = red @green = green @blue = blue @alpha = alpha end # 设定所有属性 def set(red, green, blue, alpha=255) @red = red @green = green @blue = blue @alpha = alpha endend=end复制代码
复制代码用到了某柳的东西,感觉轮子这个还是不错的{/hx}
本帖来自P1论坛作者小传子,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址: https://rpg.blue/forum.php?mod=viewthread&tid=89989 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。 |
|