#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
# Spritesheet Seperator/Combiner
# Author: ForeverZer0
# Date: 5.14.2011
# Version: 1.0
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
#
# Introduction:
# This is a very basic script I wrote to help myself split up one of them big
# icon sheets into individual files. After admiring its niftiness for a sec, I
# realized someone else may get some use out of it as well, so here it is.
#
# Features:
# - Extremely simple to use.
# - Splits large icon/sprite sheets up into uniform images, then saves them as
# individual files in a matter of seconds.
# - Can seperate any image into pieces of any size.
# - Combines many images of any size into one single file
# - Lightweight and fast
#
# Instructions:
# - Place script in new project or temporarily in an existing game anywhere
# before "Main"
# - Make any needed changes to the few configurations at the top of the script
# - Run the game
#
# Credits:
# - ForeverZer0, for the script
#
# Author's Notes:
# - Report bugs/issues at [url=http://www.chaos-project.com]www.chaos-project.com[/url]
#
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
# BEGIN CONFIGURATION
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
MODE = 1
# Select the mode to run in.
# 0 = Split Image
# 1 = Combine Images
FOLDER_NAME = 'Images'
# The folder name that the images will be placed into, or the folder where
# the images are contained that will be combined.
#---------------------------------
# Image Splitting
#---------------------------------
SOURCE_FILE = 'test.png'
# The name of the source file that will be split. Place in game directory.
SPLIT_X = 24
SPLIT_Y = 24
# The width/height in pixels to split the image file into on each axis.
BASE_NAME = 'icon'
# The base name used for the output files.
NAMING_TYPE = 1
# Define the naming convention applied to the base name.
# 0 = Numerically. (icon 1, icon 2, icon 3, etc, etc)
# 1 = Coordinates. (icon 1x2, icon 3x4, icon 3x5, etc. etc)
#---------------------------------
# Image Combining
#---------------------------------
IMAGES_WIDE = 12
# The number of images that will be placed per row
FILENAME = 'combined'
# The output filename
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
# END CONFIGURATION
#=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
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
#-------------------------------------------------------------------------------
def make_header
return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
end
#-------------------------------------------------------------------------------
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
#-------------------------------------------------------------------------------
def make_idat
header = "\x49\x44\x41\x54"
data = make_bitmap_data
data = Zlib::Deflate.deflate(data, 8)
crc = [Zlib.crc32(header + data)].pack("N")
size = [data.length].pack("N")
return size + header + data + crc
end
#-------------------------------------------------------------------------------
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
#-------------------------------------------------------------------------------
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
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
#-------------------------------------------------------------------------------
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
#===============================================================================
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("/")
dir.each_index {|i|
unless dir == "."
add_dir = dir[0..i].join("/")
begin
Dir.mkdir(add_dir)
rescue
end
end
}
end
end
#===============================================================================
# Processing
#===============================================================================
time = Time.now
if MODE == 0
bitmap = Bitmap.new(SOURCE_FILE)
count = 0
(0...(bitmap.width / SPLIT_X)).each {|x| (0...(bitmap.height / SPLIT_Y)).each {|y|
count += 1
icon = Bitmap.new(SPLIT_X, SPLIT_Y)
rect = Rect.new(x * SPLIT_X, y * SPLIT_Y, SPLIT_X, SPLIT_Y)
icon.blt(0, 0, bitmap, rect)
name = (BASE_NAME + (NAMING_TYPE == 0 ? " #{count}" : " #{x+1}x#{y+1}"))
icon.make_png(name, FOLDER_NAME + '/')
if count % 80 == 0
Graphics.update
end
}}
elsif MODE == 1
images = Dir.entries(FOLDER_NAME) - ['.', '..']
if images.empty?
print("No image files found in #{FOLDERNAME} directory.")
exit
end
images.collect! {|filename| Bitmap.new("#{FOLDER_NAME}/#{filename}") }
w, h, num = images[0].width, images[0].height, images.size
canvas = Bitmap.new(w * IMAGES_WIDE, (num.to_f / IMAGES_WIDE).ceil * h)
images.each_with_index {|image, i|
x, y = (i % IMAGES_WIDE) * w, (i / IMAGES_WIDE) * h
canvas.blt(x, y, image, Rect.new(0, 0, w, h))
if (i % 80) == 0
Graphics.update
end
}
canvas.make_png(FILENAME, '')
end
print ("Process Complete!\n" +
"#{count} images converted in #{Time.now.to_f - time.to_f} seconds.")
exit