From c1a725742c91a29dab4eb7d3016e467a5675878a Mon Sep 17 00:00:00 2001 From: Yoshihiro Yamazaki Date: Tue, 4 Dec 2012 03:48:46 +0900 Subject: [PATCH] =?utf8?q?JPEG=20chunk=20=E3=82=92=E3=83=96=E3=83=A9?= =?utf8?q?=E3=82=A6=E3=82=B6=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=A7=E3=81=8D?= =?utf8?q?=E3=82=8B=E9=A0=86=E7=95=AA=E3=81=AB=E4=B8=A6=E3=81=B3=E6=9B=BF?= =?utf8?q?=E3=81=88=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- bitmap.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/bitmap.js b/bitmap.js index a878299..f7e070d 100644 --- a/bitmap.js +++ b/bitmap.js @@ -5,8 +5,60 @@ FlappBitmap.prototype = { }; + FlappBitmap.jpegChunkOffsets = function(jpegData) { + var offsetTable = {}; + var ibit = new FlappIBit(); + while (ibit.HasNext(2)) { + var marker = ibit.ui16be(); + var offset = ibit.getBytePos(); + switch (marker) { + case 0xFFD8: // SOI + case 0xFFD9: // EOI + break; + case 0xFFDA: // SOS + [RST] + EOI + length = ibit.len() - offset; + offsetTable[marker] = [offset, length] + break; + default: + length = ibit.ui16be() + 2; + offsetTable[marker] = [offset, length] + + break; + } + } + } + FlappBitmap.toJpeg = function(swfJpeg, jpegTables) { - return swfJpeg; + var hasDQT = false; + var offsetTable = FlappBitmap.jpegChunkOffsets(swfJpeg); + if (0xFFDB in offsetTable) { + hasDQT = true; + } + if (hasDQT === false) { + var offsetTable2 = FlappBitmap.jpegChunkOffsets(jpegTables); + } + var jpegArray = [0xFF, 0xD8]; // SOI + // APP0, SOF0, DQT, DHT, SOS + var jpegOrder = [0xFFE0, 0xFFC0, 0xFFDB, 0xFFC4, 0xFFDA]; + for (var i = 0, l = jpegOrder; i < l ; i++) { + var marker = jpegOrder[i]; + var swfJpegOffset = (marker in offsetTable)?true:false; + if (swfJpegOffset) { + var entry = offsetTable[marker]; + } else { + var entry = offsetTable2[marker]; + } + var offset = entry[0]; + var enfoffset = offset + entry[1]; + for (j = offset; j < enfoffset ; j++) { + if (swfJpegOffset) { + jpegArray.join(swfJpeg[j]); + } else { + jpegArray.join(jpegTables[j]); + } + } + } + return FlappString.ArrayToString(jpegArray).join(''); }; FlappBitmap.toPng = function(lossless) { ; -- 2.11.0