Skip to content

Instantly share code, notes, and snippets.

@jin1016
Created December 28, 2013 15:39
Show Gist options
  • Save jin1016/8160752 to your computer and use it in GitHub Desktop.
Save jin1016/8160752 to your computer and use it in GitHub Desktop.
TJS2でBitmapファイル読み込みテスト
Plugins.link("plugin/BinaryStream.dll");
const bsRead = 0;
const bsWrite = 1;
const bsAppend = 2;
const bsUpdate = 3;
const bsSeekSet = 0;
const bsSeekCur = 1;
const bsSeekEnd = 2;
var stream = new BinaryStream("sample.bmp",bsRead);
var bmpfileheader = stream.read(2+4+2+2+4);
var filesize = 0;
var offsetimage = 0;
if( bmpfileheader !== void ) {
var header = bmpfileheader.unpack("CCLSSL");
if( header !== null ) {
if( header[0] == 0x42 && header[1] == 0x4d ) { // BM
filesize = header[2];
Debug.message( "file size: " + filesize );
offsetimage = header[5];
Debug.message( "image offset: " + offsetimage );
}
}
}
var width = 0;
var height = 0;
var bitcount = 0;
var imagesize = 0;
var bmpheader = stream.read(4+4+4+2+2+4+4+4+4+4+4); // 新しいバージョンは考えない
if( bmpheader !== void ) {
var header = bmpheader.unpack("LllSSLLLLLL");
if( header !== null && header[0] == 40 ) {
width = header[1];
Debug.message( "width: " + width );
height = header[2];
Debug.message( "height: " + height );
var biPlanes = header[3];
Debug.message( "planes: " + biPlanes );
if( biPlanes != 1 ) throw new Exception("Not support format");
bitcount = header[4];
Debug.message( "bit count: " + bitcount );
if( bitcount != 24 && bitcount != 32 ) throw new Exception("Not support format");
var biCompression = header[5];
Debug.message( "compression: " + biCompression );
if( biCompression != 0 ) throw new Exception("Not support format");
imagesize = header[6];
var biXPixPerMeter = header[7];
Debug.message( "xppm: " + biXPixPerMeter );
var biYPixPerMeter = header[8];
Debug.message( "yppm: " + biYPixPerMeter );
var biClrUsed = header[9];
Debug.message( "palette used: " + biClrUsed );
var biClrImporant = header[10];
Debug.message( "important palette: " + biClrImporant );
}
}
if( width != 0 && height != 0 ) {
stream.seek( offsetimage, bsSeekSet );
var imagedata = stream.read(filesize-offsetimage);
if( imagedata !== void ) {
var img = imagedata.unpack("C*");
if( img !== null ) {
if( height < 0 ) height = -height; // 逆さ無視
var reverse = height-1;
var line = (width * bitcount) / 8;
if ((line % 4) != 0) {
line = ((line \ 4) + 1) * 4;
}
var numcolorbyte = 3;
var bitmap = new Bitmap(width,height);
var index = 0;
if( bitcount == 32 ) {
numcolorbyte = 4;
}
for( var y = 0; y < height; y++ ) {
var offset = index;
for( var x = 0; x < width; x++ ) {
var b = img[offset+0];
var g = img[offset+1];
var r = img[offset+2];
var color = (r << 16) | (g << 8) | b;
bitmap.setPixel( x, reverse-y, color );
bitmap.setMaskPixel( x, reverse-y, 255 );
offset+=numcolorbyte;
}
index += line;
}
bitmap.save( "sample.png", "png24" );
}
}
}
stream.close();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment