# Creates an instance of Bitmap by loading an existing image file
init load(path: String)
do
self.file_path = path
var temp = path.file_extension
if temp != null then
self.file_extension = temp
else
self.file_extension = ""
end
var fileReader = new FileReader.open(path)
# =============== Bitmap header ================
for x in [0..13] do
var b = fileReader.read_byte
if b < 0 then return
bitmap_header[x] = b
end
self.file_size = get_value(bitmap_header.subarray(2, 4))
self.data_offset = get_value(bitmap_header.subarray(10, 4))
# =============== DIB header ================
for x in [0..39] do
var b = fileReader.read_byte
if b < 0 then return
dib_header[x] = b
end
var dib_size = get_value(dib_header.subarray(0, 4))
# only support BITMAPINFOHEADER
if dib_size != 40 then
print "This type of bitmap is not supported"
fileReader.close
return
end
self.width = get_value(dib_header.subarray(4, 4))
self.height = get_value(dib_header.subarray(8, 4))
self.bits_per_pixel = get_value(dib_header.subarray(14, 2))
self.image_size = get_value(dib_header.subarray(20, 4))
if self.bits_per_pixel != 24 then
print "Only full color bitmaps are supported"
fileReader.close
return
end
if self.bits_per_pixel == 24 then
# assert self.image_size + 54 <= self.file_size
# start loading image data, for now assume no padding
for x in [0..self.height[
do
var row = new Array[Int].with_capacity(self.width)
var rgb_str = new CString(3)
for y in [0..self.width[
do
var bts = fileReader.read_bytes_to_cstring(rgb_str, 3)
if bts < 3 then return
var red = rgb_str[0] << 16
var green = rgb_str[1] << 8
var blue = rgb_str[2]
row.add(red.to_i + green.to_i + blue.to_i)
end
self.data.add(row)
end
end
fileReader.close
end
lib/bitmap/bitmap.nit:118,2--184,4