图像处理基本方法-ruby语言生成纯色BMP文件
之前使用过c、java、python、go等其他语言实现过生成纯色BMP图片的功能。
现在由ruby语言完成该功能。其他的一些背景和环境就不在赘述,主要还是在ubuntu下使用ruby语言环境完成。
1、ruby语言简介
Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 语言。由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生石pearl(珍珠)相同,因此Ruby以7月诞生石ruby(红宝石)命名。
2、代码实现
# !/usr/bin/rub
bitMapFileHeader = Array.new(14)
width = 1920;
height = 1080;
bit = 3;
Red = 255;
Green = 255;
Blue = 0;
bfType = 'BM'
bfSize = (width*height*bit + 54);
bfReserved1 = 0;
bfReserved2 = 0;
bfOffBits = 54;
biSize = 40
biWidth = width;
biHeight = height;
biPlanes = 1;
biBitCount = bit * 8;
biCompression = 0
biSizeImage = 0;
biXPelsPerMeter = 3780;
biYPelsPerMeter = 3780;
biClrUsed = 0;
biClrImportant = 0;
bmpDataSize = bfSize - 54;
def intToArray(inputData, count)
a1 = 0;
a2 = 0;
a3 = 0;
a4 = 0;
if count == 1 then
a1 = inputData & 0xff;
arrays = Array.[](a1)
return arrays;
elsif count == 2 then
a1 = inputData & 0xff;
a2 = (inputData >> 8) & 0xff;
arrays = Array.[](a1, a2)
return arrays;
elsif count == 4 then
a1 = inputData & 0xff;
a2 = (inputData >> 8) & 0xff;
a3 = (inputData >> 16) & 0xff;
a4 = (inputData >> 24) & 0xff;
#puts inputData,a1,a2,a3,a4;
arrays = Array.[](a1, a2, a3, a4)
return arrays;
end
return -1;
end
aFile = File.new("test-rb.bmp", "wb")
if aFile
puts "Open file success!"
puts bfType;
#aFile.syswrite(bfType)
#aFile.syswrite(bfSize)
#aFile.syswrite(bfSize.to_s)
#aFile.syswrite(String(bfSize)) #aFile.syswrite(bfSize.to_s(16))
#aFile.syswrite(bfSize.to_s(16).unpack("h*"))
#aFile.syswrite(bfSize.pack("CCC"))
#tmp = String(bfSize.to_s(16))
#puts tmp;
bytes = [];
bytes = 255;
#tmp = bytes.map{|b| b.to_i(16)};
#puts tmp;
#aFile.syswrite(255.to_s(16)) # ff
#aFile.syswrite(255.to_s(16).chr) # f
#aFile.syswrite(0xff) # 255
#aFile.syswrite(0xff.to_s) # 255
#aFile.syswrite(0xff.to_s(16)) # ff
#aFile.syswrite(0xff.to_s(16).ord) # 102
#aFile.syswrite(255.to_s(16).pack('a2'))
#aFile.syswrite( String(bfSize.to_s(16)) )
bitMapFileHeader[0] = 1;#bfType;
bitMapFileHeader[1] = 2;#bfSize;
bitMapFileHeader[4] = 3;#bfOffBits;
#aFile.syswrite(bitMapFileHeader.pack('a2LS2L'))
#nums = Array.[](0x42, 0x4d, 0x36, 0xEC, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00)
#aFile.syswrite(nums.pack('c14')) # 255
aFile.syswrite(bfType)
#nums = intToArray(bfSize, 4);
#puts nums;
#nums = Array.[](0x36, 0xEC, 0x5E, 0x00);
#aFile.syswrite(nums.pack('c4'))
aFile.syswrite(intToArray(bfSize, 4).pack('c4'))
aFile.syswrite(intToArray(bfReserved1, 2).pack('c2'))
aFile.syswrite(intToArray(bfReserved2, 2).pack('c2'))
aFile.syswrite(intToArray(bfOffBits, 4).pack('c4'))
#nums = Array.[]( 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00)
#aFile.syswrite(nums.pack('c8')) # 255
#nums = Array.[](0x28, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)
#aFile.syswrite(nums.pack('c40')) # 255
aFile.syswrite(intToArray(biSize, 4).pack('c4'))
aFile.syswrite(intToArray(biWidth, 4).pack('c4'))
aFile.syswrite(intToArray(biHeight, 4).pack('c4'))
aFile.syswrite(intToArray(biPlanes, 2).pack('c2'))
aFile.syswrite(intToArray(biBitCount, 2).pack('c2'))
aFile.syswrite(intToArray(biCompression, 4).pack('c4'))
aFile.syswrite(intToArray(biSizeImage, 4).pack('c4'))
aFile.syswrite(intToArray(biXPelsPerMeter, 4).pack('c4'))
aFile.syswrite(intToArray(biYPelsPerMeter, 4).pack('c4'))
aFile.syswrite(intToArray(biClrUsed, 4).pack('c4'))
aFile.syswrite(intToArray(biClrImportant, 4).pack('c4'))
puts "write bmp file before"
nums = Array.[](Blue, Green, Red);
for i in 0 .. height - 1
for j in 0 .. width - 1
aFile.syswrite(nums.pack('c3')) # 255
end
end
puts "write bmp file out"
aFile.close
else
puts "Unable to open file!"
end
3、执行程序
命令如下:
ruby testbmp.rb
执行命令后会出现bmp文件,表示使用ruby语言生成了纯色bmp文件。
4、参考资料
https://blog.csdn.net/slowsnowscar/article/details/78247748