投稿者 tel | 2013年4月25日

Node.jsでPNGを読み込む

Node.jsでPNGを読み込んでjsonを出力する必要があったのでメモ。

Node.jsでPNGを読み込むためのモジュールは検索したらいくつか見つかった。

とりあえず一番上のやつを使ってみた。

npm install png-js

でインストールして

'use strict';

var PNG = require('png-js'),
	fs = require('fs');

function rgb(r, g, b) {
	return '#' + ('0' + (r^0).toString(16)).slice(-2) + ('0' + (g^0).toString(16)).slice(-2) + ('0' + (b^0).toString(16)).slice(-2);
}

// 画像をインデックス形式にする
function getIndexedImage(data, indexData, paletteData) {
	var count = 0,
		pal = [];
	for(var i = 0, j = 0, n = data.length; i < n; i += 4, j++) {
		var r = data[i],
			g = data[i + 1],
			b = data[i + 2],
			a = data[i + 3],
			color = rgb(r, g, b),
			index = pal.indexOf(color);
		if(index < 0) {
			pal.push(color);
			index = count++;
			var p = index * 4;
			paletteData[p] = r;
			paletteData[p + 1] = g;
			paletteData[p + 2] = b;
			paletteData[p + 3] = 255;

			if(count > 256) {
				throw new Error('index over');
			}
		}
		indexData[j] = index;
	}
	return pal;
}

if (process.argv.length > 2) {
    var filename = process.argv[2],
        png = PNG.load(filename),
        indexData = new Uint8Array(png.width * png.height),
        paletteData = new Uint8Array(4 * 256);

        png.decode(function(pixels) {
            getIndexedImage(pixels, indexData, paletteData);

            // jsonにするためにBase64変換
            var jsonData = {
                index: new Buffer(indexData).toString('base64'),
                palette: new Buffer(paletteData).toString('base64'),
                width: png.height,
                height: png.width
            };

            var json = JSON.stringify(jsonData);

            console.log(json);
    });
}

画像の幅と高さを取得したかったが、githubのドキュメントだと使い方が詳しく載っていなかった。とりあえずloadしてオブジェクトのプロパティから幅と高さを取得して、あとはdecodeすれば画像が読み込めるみたい。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。