jpeg.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*jslint browser: true, devel: true, bitwise: false, debug: true, eqeq: false, es5: true, evil: false, forin: false, newcap: false, nomen: true, plusplus: true, regexp: false, unparam: false, sloppy: true, stupid: false, sub: false, todo: true, vars: true, white: true */
  2. module.exports = {
  3. parseSections: function(stream, iterator) {
  4. var len, markerType;
  5. stream.setBigEndian(true);
  6. //stop reading the stream at the SOS (Start of Stream) marker,
  7. //because its length is not stored in the header so we can't
  8. //know where to jump to. The only marker after that is just EOI (End Of Image) anyway
  9. while(stream.remainingLength() > 0 && markerType !== 0xDA) {
  10. if(stream.nextUInt8() !== 0xFF) {
  11. throw new Error('Invalid JPEG section offset');
  12. }
  13. markerType = stream.nextUInt8();
  14. //don't read size from markers that have no datas
  15. if((markerType >= 0xD0 && markerType <= 0xD9) || markerType === 0xDA) {
  16. len = 0;
  17. } else {
  18. len = stream.nextUInt16() - 2;
  19. }
  20. iterator(markerType, stream.branch(0, len));
  21. stream.skip(len);
  22. }
  23. },
  24. //stream should be located after SOF section size and in big endian mode, like passed to parseSections iterator
  25. getSizeFromSOFSection: function(stream) {
  26. stream.skip(1);
  27. return {
  28. height: stream.nextUInt16(),
  29. width: stream.nextUInt16()
  30. };
  31. },
  32. getSectionName: function(markerType) {
  33. var name, index;
  34. switch(markerType) {
  35. case 0xD8: name = 'SOI'; break;
  36. case 0xC4: name = 'DHT'; break;
  37. case 0xDB: name = 'DQT'; break;
  38. case 0xDD: name = 'DRI'; break;
  39. case 0xDA: name = 'SOS'; break;
  40. case 0xFE: name = 'COM'; break;
  41. case 0xD9: name = 'EOI'; break;
  42. default:
  43. if(markerType >= 0xE0 && markerType <= 0xEF) {
  44. name = 'APP';
  45. index = markerType - 0xE0;
  46. }
  47. else if(markerType >= 0xC0 && markerType <= 0xCF && markerType !== 0xC4 && markerType !== 0xC8 && markerType !== 0xCC) {
  48. name = 'SOF';
  49. index = markerType - 0xC0;
  50. }
  51. else if(markerType >= 0xD0 && markerType <= 0xD7) {
  52. name = 'RST';
  53. index = markerType - 0xD0;
  54. }
  55. break;
  56. }
  57. var nameStruct = {
  58. name: name
  59. };
  60. if(typeof index === 'number') {
  61. nameStruct.index = index;
  62. }
  63. return nameStruct;
  64. }
  65. };