赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 85 |
最后登录 | 2013-6-28 |
在线时间 | 1 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 1 小时
- 注册时间
- 2007-7-18
- 帖子
- 71
|
3楼
楼主 |
发表于 2009-1-17 05:03:37
|
只看该作者
我試過了....沒有反應,還是正常遊戲
我的段落一是:
- # 将bitmap对象输出成bmp文件 By MOMOMO
- # 翻译:bbschat 来自:www.66rpg.com
- # 将Bitmap对象
- # 转换成位图文件(24bit)输出。
- #
- # Bmp_File.make_bmp_file(bitmap, name[, path])
- # bitmap:Bitmap对象
- # name:保存文件名
- # path:保存路径
- #
- # 或者,对Bitmap对象直接使用
- # bitmap_obj.make_bmp_file(name[, path])
- # 也可以达成同样的机能。
- module Bmp_File
- module_function
- # 生成BMP文件
- def make_bmp_file(bitmap, name, path="")
- file_header = make_bmp_file_header(bitmap)
- info_header = make_bmp_info_header(bitmap)
- bitmap_data = make_bitmap_data(bitmap)
- make_dir(path) if path != ""
- file = File.open(path + name + ".bmp", "wb")
- file.write(file_header)
- file.write(info_header)
- file.write(bitmap_data)
- file.close
- 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
- # 从Bitmap对象中生成文件头
- def make_bmp_file_header(bitmap)
- bf_type = ["BM"].pack("a2")
- bf_size = [get_bf_size(bitmap)].pack("L")
- bf_Reserved1 = [0].pack("S")
- bf_Reserved2 = [0].pack("S")
- bf_OffBits = [54].pack("L")
-
- file_header = bf_type + bf_size + bf_Reserved1 + bf_Reserved2 + bf_OffBits
- return file_header
- end
- # 从Bitmap对象中生成情报头
- def make_bmp_info_header(bitmap)
- bi_size = [40].pack("L")
- bi_width = [get_bi_width(bitmap)].pack("L")
- bi_height = [get_bi_height(bitmap)].pack("L")
- bi_planes = [1].pack("S")
- bi_bitcount = [24].pack("S")
- bi_copmression = [0].pack("L")
- bi_sizeimage = [0].pack("L")
- bi_x_pixpermeter = [0].pack("L")
- bi_y_pixpermeter = [0].pack("L")
- bi_clrused = [0].pack("L")
- bi_cirimportant = [0].pack("L")
-
- info_header = bi_size + bi_width + bi_height + bi_planes + bi_bitcount +
- bi_copmression + bi_sizeimage + bi_x_pixpermeter +
- bi_y_pixpermeter + bi_clrused + bi_cirimportant
-
- return info_header
- end
- # 从Bitmap对象中生成图像数据
- def make_bitmap_data(bitmap)
- w = bitmap.width
- h = bitmap.height
- w = (w / 4 + 1) * 4 if w % 4 != 0
- data = []
- for y in 0...h
- for x in 0...w
- color = bitmap.get_pixel(x, (h - 1) - y)
- data.push(color.blue)
- data.push(color.green)
- data.push(color.red)
- end
- end
- return data.pack("C*")
- end
- def get_bf_size(bitmap)
- w = bitmap.width
- w = (w / 4 + 1) * 4 if w % 4 != 0
- h = bitmap.height
- return w * h * 3
- end
- def get_bi_width(bitmap)
- return bitmap.width
- end
- def get_bi_height(bitmap)
- return bitmap.height
- end
- end
- class Bitmap
- def make_bmp_file(name, path="")
- Bmp_File.make_bmp_file(self, name, path)
- end
- end
- #==============================================================================
- # 本脚本出自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,转载请注明。
- #==============================================================================
复制代码
因為沒有大號所以看不到,幫我看看這個是不是? |
|