Skip to content

Instantly share code, notes, and snippets.

@idealhack
Created January 31, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save idealhack/fa76498ababd9f12bf69 to your computer and use it in GitHub Desktop.
Save idealhack/fa76498ababd9f12bf69 to your computer and use it in GitHub Desktop.
Read and Write PNG in Binary
// PNG 格式定义
// http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm
var fs = require('fs');
// 测试文件
var FILE_IN = 'in.png'
, FILE_OUT = 'out.png';
var out = '';
// 标识符、区块
var SIGNATURE = '89504e470d0a1a0a'
, SIGNATURE_POSITION = 0
, IHDR = '49484452'
, IHDR_POSITION = 0
, IHDR_LENGTH = 0
, IHDR_SEGMENT = ''
, IDAT = '49444154'
, IDAT_POSITION = 0
, IDAT_LENGTH = 0
, IDAT_SEGMENT = ''
, IEND = '0000000049454e44ae426082'
, IEND_POSITION = 0;
// 读文件
fs.readFile(FILE_IN, function (err, data) {
if (err) throw err;
var h = data.toString('hex');
// 读取块
SIGNATURE_POSITION = h.indexOf(SIGNATURE);
IHDR_POSITION = h.indexOf(IHDR);
IHDR_LENGTH = parseInt(h.substring(IHDR_POSITION - 8, IHDR_POSITION), 16);
IHDR_SEGMENT = h.substring(IHDR_POSITION - 8, IHDR_POSITION + 8 + IHDR_LENGTH * 2 + 8);
IDAT_POSITION = h.indexOf(IDAT);
IDAT_LENGTH = parseInt(h.substring(IDAT_POSITION - 8, IDAT_POSITION), 16);
IDAT_SEGMENT = h.substring(IDAT_POSITION - 8, IDAT_POSITION + 8 + IDAT_LENGTH * 2 + 8);
IEND_POSITION = h.indexOf(IEND);
// 生成块
out += SIGNATURE;
out += IHDR_SEGMENT;
out += IDAT_SEGMENT;
out += IEND;
outBuffer = new Buffer(out, 'hex');
// 写文件
fs.writeFile(FILE_OUT, outBuffer, function (err) {
if (err) throw err;
console.log('OK');
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment