一个Node模块,用于获取任何图像文件的尺寸。css
git:https://github.com/image-size/image-sizenode
首先整理出一份流程图来分析 一图胜万语: git
nodejs 的包加载机制github
bin/image-size.jsweb
var imageSize = require('..');
复制代码
package.jsonchrome
"main": "lib/index.js"
复制代码
require('..') 具体加载了哪一个文件?json
nodejs 的包加载机制会把 '..' 解析成 '../',而后会尝试去 package.json 内取 main 字段的值,做为文件加载的入口,因此这里加载了 lib/index.js。api
检测用户的输入bash
var files = process.argv.slice(2);
if (!files.length) {
console.error('Usage: image-size image1 [image2] [image3] ...');
process.exit(-1);
}
复制代码
经过 process.argv.slice(2) 获取用户的输入,而且在用户没有输入的状况下给予提示和帮助。异步
检测当前文件是否存在
fs.existsSync(path.resolve(image)
复制代码
先把图片的路径转换为绝对路径 而后调用 fs.existsSync 方法。
虽然 fs.exists() 是废弃的,但 fs.existsSync() 不是。--nodejs 文档
读取文件转换为 buffer
function asyncFileToBuffer (filepath, callback) {
// open the file in read only mode
fs.open(filepath, 'r', function (err, descriptor) {
if (err) { return callback(err); }
fs.fstat(descriptor, function (err, stats) {
if (err) { return callback(err); }
var size = stats.size;
if (size <= 0) {
return callback(new Error('File size is not greater than 0 —— ' + filepath));
}
var bufferSize = Math.min(size, MaxBufferSize);
var buffer = new Buffer(bufferSize);
// read first buffer block from the file, asynchronously
fs.read(descriptor, buffer, 0, bufferSize, 0, function (err) {
if (err) { return callback(err); }
// close the file, we are done
fs.close(descriptor, function (err) {
callback(err, buffer);
});
});
});
});
}
复制代码
function syncFileToBuffer (filepath) {
// read from the file, synchronously
var descriptor = fs.openSync(filepath, 'r');
var size = fs.fstatSync(descriptor).size;
var bufferSize = Math.min(size, MaxBufferSize);
var buffer = new Buffer(bufferSize);
fs.readSync(descriptor, buffer, 0, bufferSize, 0);
fs.closeSync(descriptor);
return buffer;
}
复制代码
这里做者限制了 buffer 的大小,否则的话使用 fs.createReadStream 更为方便些。
检测图片的类型
在 lib/types 文件夹内有着全部格式的扩展类,而且在 lib/types.js 文件内统一加载导入
var typeHandlers = {
bmp: require('./types/bmp'),
cur: require('./types/cur'),
dds: require('./types/dds'),
gif: require('./types/gif'),
icns: require('./types/icns'),
ico: require('./types/ico'),
jpg: require('./types/jpg'),
png: require('./types/png'),
psd: require('./types/psd'),
svg: require('./types/svg'),
tiff: require('./types/tiff'),
webp: require('./types/webp'),
};
复制代码
能够用一个类专门作多文件导入之类的处理。
全部的格式扩展类导出的方法名都是 'detect' 和 'calculate'
lib/detector.js
module.exports = function (buffer, filepath) {
var type, result;
for (type in typeHandlers) {
result = typeHandlers[type].detect(buffer, filepath);
if (result) {
return type;
}
}
};
复制代码
统一了格式扩展类导出的方法名,方便扩展。之后再扩展不一样格式的图片时,只须要增长对应的格式扩展类,而无需改变当前的代码。(对修改关闭 对扩展开放 --ocp原则)
获取图片的信息
不一样的图片格式获取信息的方式不一致,这里涉及的知识有点深,这里只是记录下思路,具体须要时在详细的查询。
记录大端读取和小端读取的区别:
const buf = Buffer.from([0x12, 0x34, 0x56]);
console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234 大端在右
console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412 小端在右
复制代码
console.log 输出带颜色的字体
在最后返回结果的时候,宽和高数据都是绿色的。发现 console.log 原来是能够设置 css 样式的。
例如(能够在 chrome 开发者模式下输入看下样式)
console.log( '%c你好', 'color:red' )
复制代码
%c 后面的全部字体能够做用写好的 css样式。
console.log( '%c你好%c今天学习了吗', 'color:red' , 'color:yellow')
复制代码
多个字体样式的使用
阅读源码能够开阔本身的视野,也能更好的学习 nodejs。先从简单的模块入手,慢慢在增长难度,学习做者的思路和套路。