123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /**
- * @author shaozilee
- *
- * BMP format encoder,encode 24bit BMP
- * Not support quality compression
- *
- */
- function BmpEncoder(imgData){
- this.buffer = imgData.data;
- this.width = imgData.width;
- this.height = imgData.height;
- this.extraBytes = this.width%4;
- this.rgbSize = this.height*(3*this.width+this.extraBytes);
- this.headerInfoSize = 40;
- this.data = [];
- /******************header***********************/
- this.flag = "BM";
- this.reserved = 0;
- this.offset = 54;
- this.fileSize = this.rgbSize+this.offset;
- this.planes = 1;
- this.bitPP = 24;
- this.compress = 0;
- this.hr = 0;
- this.vr = 0;
- this.colors = 0;
- this.importantColors = 0;
- }
- BmpEncoder.prototype.encode = function() {
- var tempBuffer = new Buffer(this.offset+this.rgbSize);
- this.pos = 0;
- tempBuffer.write(this.flag,this.pos,2);this.pos+=2;
- tempBuffer.writeUInt32LE(this.fileSize,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.reserved,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.offset,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.headerInfoSize,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.width,this.pos);this.pos+=4;
- tempBuffer.writeInt32LE(-this.height,this.pos);this.pos+=4;
- tempBuffer.writeUInt16LE(this.planes,this.pos);this.pos+=2;
- tempBuffer.writeUInt16LE(this.bitPP,this.pos);this.pos+=2;
- tempBuffer.writeUInt32LE(this.compress,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.rgbSize,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.hr,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.vr,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.colors,this.pos);this.pos+=4;
- tempBuffer.writeUInt32LE(this.importantColors,this.pos);this.pos+=4;
- var i=0;
- var rowBytes = 3*this.width+this.extraBytes;
- for (var y = 0; y <this.height; y++){
- for (var x = 0; x < this.width; x++){
- var p = this.pos+y*rowBytes+x*3;
- i++;//a
- tempBuffer[p]= this.buffer[i++];//b
- tempBuffer[p+1] = this.buffer[i++];//g
- tempBuffer[p+2] = this.buffer[i++];//r
- }
- if(this.extraBytes>0){
- var fillOffset = this.pos+y*rowBytes+this.width*3;
- tempBuffer.fill(0,fillOffset,fillOffset+this.extraBytes);
- }
- }
- return tempBuffer;
- };
- module.exports = function(imgData, quality) {
- if (typeof quality === 'undefined') quality = 100;
- var encoder = new BmpEncoder(imgData);
- var data = encoder.encode();
- return {
- data: data,
- width: imgData.width,
- height: imgData.height
- };
- };
|