@abasb75/dicom-parser 0.0.0-test1 → 0.0.0-test3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Parser.js ADDED
@@ -0,0 +1,282 @@
1
+ import Dataset from "./Dataset";
2
+ import Tag from "./Tag";
3
+ import Value from "./Value";
4
+ import * as pako from "pako";
5
+ var Parser = /** @class */ (function () {
6
+ function Parser(arrayBuffer) {
7
+ Object.defineProperty(this, "start", {
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true,
11
+ value: void 0
12
+ });
13
+ Object.defineProperty(this, "end", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: void 0
18
+ });
19
+ Object.defineProperty(this, "arrayBuffer", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ Object.defineProperty(this, "offset", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ Object.defineProperty(this, "dataView", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: void 0
36
+ });
37
+ Object.defineProperty(this, "tags", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: {}
42
+ });
43
+ Object.defineProperty(this, "dataSet", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: void 0
48
+ });
49
+ Object.defineProperty(this, "EXEPTED", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: ["OB", "OW", "SQ", "UN", "UT", "OF", "UC"]
54
+ });
55
+ Object.defineProperty(this, "VRS", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: ["AE", "AS", "AT", "CS", "DA", "DS", "DT", "FL", "FD", "IS", "LO", "LT", "OB", "OD", "OF", "OW", "PN", "SH", "SL", "SS", "ST", "TM", "UI", "UL", "UN", "US", "UT", "UC"]
60
+ });
61
+ Object.defineProperty(this, "IMPLICT_TRANSFER_SYNTAXES", {
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true,
65
+ value: ["1.2.840.10008.1.2"]
66
+ });
67
+ Object.defineProperty(this, "BIG_ENDIAN_TRANSFER_SYNTAXES", {
68
+ enumerable: true,
69
+ configurable: true,
70
+ writable: true,
71
+ value: ["1.2.840.10008.1.2.2"]
72
+ });
73
+ Object.defineProperty(this, "DEFLATED_TRANSFER_SYNTAXES", {
74
+ enumerable: true,
75
+ configurable: true,
76
+ writable: true,
77
+ value: ["1.2.840.10008.1.2.1.99"]
78
+ });
79
+ Object.defineProperty(this, "littleEndian", {
80
+ enumerable: true,
81
+ configurable: true,
82
+ writable: true,
83
+ value: true
84
+ });
85
+ Object.defineProperty(this, "implicit", {
86
+ enumerable: true,
87
+ configurable: true,
88
+ writable: true,
89
+ value: false
90
+ });
91
+ Object.defineProperty(this, "transferSyntaxUID", {
92
+ enumerable: true,
93
+ configurable: true,
94
+ writable: true,
95
+ value: ""
96
+ });
97
+ // private UNDEFIENED_LEN:number = 0xffffffff;
98
+ Object.defineProperty(this, "inflated", {
99
+ enumerable: true,
100
+ configurable: true,
101
+ writable: true,
102
+ value: false
103
+ });
104
+ Object.defineProperty(this, "concatArrayBuffers", {
105
+ enumerable: true,
106
+ configurable: true,
107
+ writable: true,
108
+ value: function (buffer1, buffer2) {
109
+ var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
110
+ tmp.set(new Uint8Array(buffer1), 0);
111
+ tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
112
+ return tmp.buffer;
113
+ }
114
+ });
115
+ this.start = Date.now();
116
+ this.offset = 0;
117
+ this.arrayBuffer = arrayBuffer;
118
+ this.dataView = new DataView(arrayBuffer);
119
+ if (this.arrayBuffer.byteLength < 132) {
120
+ return;
121
+ }
122
+ var prefix = Value.getString(new Uint8Array(arrayBuffer, 128, 4));
123
+ if (prefix !== 'DICM') {
124
+ return;
125
+ }
126
+ this.offset = 132;
127
+ this.parse();
128
+ }
129
+ Object.defineProperty(Parser.prototype, "parse", {
130
+ enumerable: false,
131
+ configurable: true,
132
+ writable: true,
133
+ value: function () {
134
+ this.getNextElement();
135
+ this.end = Date.now();
136
+ this.dataSet = new Dataset(this.tags, this.dataView, this.littleEndian, this.start, this.end);
137
+ this.dataSet.transferSyntaxUID = this.transferSyntaxUID;
138
+ return this.dataSet;
139
+ }
140
+ });
141
+ Object.defineProperty(Parser.prototype, "getDataset", {
142
+ enumerable: false,
143
+ configurable: true,
144
+ writable: true,
145
+ value: function () {
146
+ return this.dataSet;
147
+ }
148
+ });
149
+ Object.defineProperty(Parser.prototype, "getNextElement", {
150
+ enumerable: false,
151
+ configurable: true,
152
+ writable: true,
153
+ value: function () {
154
+ if (this.offset >= this.arrayBuffer.byteLength) {
155
+ return;
156
+ }
157
+ var _a = this.getNextGroupAndElement(), group = _a.group, element = _a.element;
158
+ if (!group && !element) {
159
+ return;
160
+ }
161
+ if (group === 0xFFFE && (element === 0xE0DD || element === 0xE00D || element === 0xE000)) {
162
+ this.offset += 4;
163
+ return this.getNextElement();
164
+ }
165
+ if (!this.implicit && group !== 0x0002 && this.IMPLICT_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
166
+ this.implicit = true;
167
+ }
168
+ if (this.littleEndian && group !== 0x0002 && this.BIG_ENDIAN_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
169
+ this.littleEndian = false;
170
+ }
171
+ if (!this.inflated && group !== 0x0002 && this.DEFLATED_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
172
+ this.offset -= 4;
173
+ var meta = this.dataView.buffer.slice(0, this.offset);
174
+ var body = this.dataView.buffer.slice(this.offset);
175
+ var infaltedBody = pako.inflateRaw(body);
176
+ this.arrayBuffer = this.concatArrayBuffers(meta, infaltedBody);
177
+ this.dataView = new DataView(this.arrayBuffer);
178
+ this.inflated = true;
179
+ return this.getNextElement();
180
+ }
181
+ var vr = this.getNextVR(group, element);
182
+ var len = 0;
183
+ if (this.implicit) {
184
+ len = this.dataView.getUint32(this.offset, this.littleEndian);
185
+ this.offset += 4;
186
+ }
187
+ else if (this.EXEPTED.includes(vr)) {
188
+ this.offset += 2; // skip 2 byte reserved
189
+ len = this.dataView.getUint32(this.offset, this.littleEndian);
190
+ this.offset += 4;
191
+ }
192
+ else if (this.VRS.includes(vr)) {
193
+ len = this.dataView.getUint16(this.offset, this.littleEndian);
194
+ this.offset += 2;
195
+ }
196
+ else if ((!vr || !vr.match(/^[A-Z]{2}$/)) && group === 0x0002 && element === 0x0000) {
197
+ this.offset = 132;
198
+ this.tags = {};
199
+ this.implicit = true;
200
+ return this.getNextElement();
201
+ }
202
+ else {
203
+ return;
204
+ }
205
+ if (group === 0x0002 && element === 0x0010) {
206
+ this.transferSyntaxUID = (Value.getString(new Uint8Array(this.arrayBuffer, this.offset, len))).replace('\0', '');
207
+ }
208
+ var tag = new Tag(group, element, vr, len, this.offset);
209
+ var key = tag.generateKey();
210
+ this.tags[key] = tag;
211
+ if (len === 0xFFFFFFFF && group === 0x7FE0 && element === 0x0010) {
212
+ var _b = this.getNextGroupAndElement(), group_1 = _b.group, element_1 = _b.element;
213
+ while (true) {
214
+ if (group_1 === 0xFFFE && element_1 === 0xE000) {
215
+ var len_1 = this.dataView.getUint32(this.offset, this.littleEndian);
216
+ this.offset += 4;
217
+ var t = this.getNextGroupAndElement();
218
+ group_1 = t.group;
219
+ element_1 = t.element;
220
+ this.offset += len_1;
221
+ }
222
+ else {
223
+ break;
224
+ }
225
+ }
226
+ this.offset -= 4;
227
+ }
228
+ if (vr === "SQ") {
229
+ this.getNextElement();
230
+ }
231
+ else {
232
+ this.offset += len;
233
+ this.getNextElement();
234
+ }
235
+ }
236
+ });
237
+ Object.defineProperty(Parser.prototype, "getValue", {
238
+ enumerable: false,
239
+ configurable: true,
240
+ writable: true,
241
+ value: function (len) {
242
+ var value = this.arrayBuffer.slice(this.offset, len);
243
+ this.offset += len;
244
+ return value;
245
+ }
246
+ });
247
+ Object.defineProperty(Parser.prototype, "getNextGroupAndElement", {
248
+ enumerable: false,
249
+ configurable: true,
250
+ writable: true,
251
+ value: function () {
252
+ try {
253
+ var group = this.dataView.getUint16(this.offset, this.littleEndian);
254
+ this.offset += 2;
255
+ var element = this.dataView.getUint16(this.offset, this.littleEndian);
256
+ this.offset += 2;
257
+ return { group: group, element: element };
258
+ }
259
+ catch (_a) {
260
+ return { group: 0, element: 0 };
261
+ }
262
+ }
263
+ });
264
+ Object.defineProperty(Parser.prototype, "getNextVR", {
265
+ enumerable: false,
266
+ configurable: true,
267
+ writable: true,
268
+ value: function (groupInt, elementInt) {
269
+ if (this.offset >= this.dataView.byteLength) {
270
+ return "";
271
+ }
272
+ if (this.implicit) {
273
+ return Tag.getTagVRFromDictionary(groupInt, elementInt) || "AA";
274
+ }
275
+ var vr = Value.getString(new Uint8Array(this.arrayBuffer, this.offset, 2));
276
+ this.offset += 2;
277
+ return vr;
278
+ }
279
+ });
280
+ return Parser;
281
+ }());
282
+ export default Parser;
package/PixelData.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import Dataset from "./Dataset";
2
+ declare class PixelData {
3
+ static getAll(dataset: Dataset): Promise<DataView[]>;
4
+ static get(dataset: Dataset, frame?: number): Promise<DataView>;
5
+ private static _getixelDataViews;
6
+ }
7
+ export default PixelData;
package/PixelData.js ADDED
@@ -0,0 +1,124 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import Tag from "./Tag";
38
+ var PixelData = /** @class */ (function () {
39
+ function PixelData() {
40
+ }
41
+ Object.defineProperty(PixelData, "getAll", {
42
+ enumerable: false,
43
+ configurable: true,
44
+ writable: true,
45
+ value: function (dataset) {
46
+ return __awaiter(this, void 0, void 0, function () {
47
+ return __generator(this, function (_a) {
48
+ return [2 /*return*/, PixelData._getixelDataViews(dataset)];
49
+ });
50
+ });
51
+ }
52
+ });
53
+ Object.defineProperty(PixelData, "get", {
54
+ enumerable: false,
55
+ configurable: true,
56
+ writable: true,
57
+ value: function (dataset_1) {
58
+ return __awaiter(this, arguments, void 0, function (dataset, frame) {
59
+ var pixelDatas;
60
+ if (frame === void 0) { frame = 0; }
61
+ return __generator(this, function (_a) {
62
+ pixelDatas = PixelData._getixelDataViews(dataset);
63
+ if (frame > pixelDatas.length) {
64
+ throw new Error("Frame ".concat(frame, " not found."));
65
+ }
66
+ return [2 /*return*/, pixelDatas[frame]];
67
+ });
68
+ });
69
+ }
70
+ });
71
+ Object.defineProperty(PixelData, "_getixelDataViews", {
72
+ enumerable: false,
73
+ configurable: true,
74
+ writable: true,
75
+ value: function (dataset) {
76
+ var pixelData = dataset.tags['0x7FE00010'] || dataset.tags['0x7FE00008'] || dataset.tags['0x7FE00009'];
77
+ var pixelDatas = [];
78
+ var numberOfFrames = dataset.pixelModule.numberOfFrames || 1;
79
+ if (pixelData.valueLength === 0xFFFFFFFF) {
80
+ var offset = pixelData.offset;
81
+ while (true) {
82
+ if (offset >= dataset.dataView.byteLength) {
83
+ break;
84
+ }
85
+ var group = dataset.dataView.getUint16(offset, dataset.littleEndian);
86
+ offset += 2;
87
+ var element = dataset.dataView.getUint16(offset, dataset.littleEndian);
88
+ offset += 2;
89
+ if (group !== 0xFFFE && element !== 0xE000) {
90
+ break;
91
+ }
92
+ else {
93
+ }
94
+ console.log('group', Tag.intTo4digitString(group));
95
+ console.log('element', Tag.intTo4digitString(element));
96
+ var len = dataset.dataView.getUint32(offset, dataset.littleEndian);
97
+ offset += 4;
98
+ if (len !== 0) {
99
+ console.log('element is 2', len);
100
+ if (len > 4) {
101
+ var dataView = new DataView(dataset.dataView.buffer.slice(offset, offset + len));
102
+ pixelDatas.push(dataView);
103
+ }
104
+ else {
105
+ offset - 4;
106
+ }
107
+ offset += len;
108
+ }
109
+ }
110
+ }
111
+ else {
112
+ var frameLen = pixelData.valueLength / numberOfFrames;
113
+ for (var i = 0; i < numberOfFrames; i++) {
114
+ var offset = pixelData.offset + (frameLen * i);
115
+ var dataView = new DataView(dataset.dataView.buffer.slice(offset, offset + frameLen));
116
+ pixelDatas.push(dataView);
117
+ }
118
+ }
119
+ return pixelDatas;
120
+ }
121
+ });
122
+ return PixelData;
123
+ }());
124
+ export default PixelData;
package/README.md CHANGED
@@ -53,7 +53,7 @@ import { parse } from "@abasb75/dicom-parser";
53
53
 
54
54
  ...
55
55
 
56
- const dataset = parse(arrayBuffer); // ArrayBuffer
56
+ const dataset = parse(arrayBuffer);
57
57
 
58
58
  ```
59
59
 
package/Tag.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ declare class Tag {
2
+ name: string;
3
+ vr: string;
4
+ group: number;
5
+ element: number;
6
+ value: unknown;
7
+ valueLength: number;
8
+ offset: number;
9
+ constructor(group: number, element: number, vr: string, valueLength: number, offset: number, value?: ArrayBuffer, name?: string | null);
10
+ generateKey(): string;
11
+ static getTagNameFromDictionary(groupInt: number, elementInt: number): string;
12
+ static getTagVRFromDictionary(group: number | string, element: number | string): string;
13
+ static intTo4digitString(int: number): string;
14
+ static int8digitString(int: number): string;
15
+ getValue(): void;
16
+ }
17
+ export default Tag;
package/Tag.js ADDED
@@ -0,0 +1,128 @@
1
+ import TagsDictionaryEnums from "./enums/TagsDictionary";
2
+ var Tag = /** @class */ (function () {
3
+ function Tag(group, element, vr, valueLength, offset, value, name) {
4
+ Object.defineProperty(this, "name", {
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true,
8
+ value: void 0
9
+ });
10
+ Object.defineProperty(this, "vr", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: void 0
15
+ });
16
+ Object.defineProperty(this, "group", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: void 0
21
+ });
22
+ Object.defineProperty(this, "element", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ Object.defineProperty(this, "value", {
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true,
32
+ value: void 0
33
+ });
34
+ Object.defineProperty(this, "valueLength", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: void 0
39
+ });
40
+ Object.defineProperty(this, "offset", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: void 0
45
+ });
46
+ this.group = group;
47
+ this.element = element;
48
+ this.vr = vr;
49
+ this.name = name || Tag.getTagNameFromDictionary(this.group, this.element) || '';
50
+ this.value = value || undefined;
51
+ this.valueLength = valueLength;
52
+ this.offset = offset;
53
+ if (this.name === '') {
54
+ }
55
+ }
56
+ Object.defineProperty(Tag.prototype, "generateKey", {
57
+ enumerable: false,
58
+ configurable: true,
59
+ writable: true,
60
+ value: function () {
61
+ var group = Tag.intTo4digitString(this.group);
62
+ var element = Tag.intTo4digitString(this.element);
63
+ return "0x".concat(group).concat(element);
64
+ }
65
+ });
66
+ Object.defineProperty(Tag, "getTagNameFromDictionary", {
67
+ enumerable: false,
68
+ configurable: true,
69
+ writable: true,
70
+ value: function (groupInt, elementInt) {
71
+ var group = Tag.intTo4digitString(groupInt);
72
+ var element = Tag.intTo4digitString(elementInt);
73
+ var groupItems = TagsDictionaryEnums[group];
74
+ if (!groupItems)
75
+ return "";
76
+ var elementItem = groupItems[element];
77
+ if (!elementItem)
78
+ return "";
79
+ return elementItem[1];
80
+ }
81
+ });
82
+ Object.defineProperty(Tag, "getTagVRFromDictionary", {
83
+ enumerable: false,
84
+ configurable: true,
85
+ writable: true,
86
+ value: function (group, element) {
87
+ var _group, _element;
88
+ if (typeof group === "number") {
89
+ _group = Tag.intTo4digitString(group);
90
+ }
91
+ if (typeof element === "number") {
92
+ _element = Tag.intTo4digitString(element);
93
+ }
94
+ var groupItems = TagsDictionaryEnums[_group || group];
95
+ if (!groupItems)
96
+ return "";
97
+ var elementItem = groupItems[_element || element];
98
+ if (!elementItem)
99
+ return "";
100
+ return elementItem[0];
101
+ }
102
+ });
103
+ Object.defineProperty(Tag, "intTo4digitString", {
104
+ enumerable: false,
105
+ configurable: true,
106
+ writable: true,
107
+ value: function (int) {
108
+ return ('0000' + int.toString(16).toUpperCase()).slice(-4);
109
+ }
110
+ });
111
+ Object.defineProperty(Tag, "int8digitString", {
112
+ enumerable: false,
113
+ configurable: true,
114
+ writable: true,
115
+ value: function (int) {
116
+ return ('00000000' + int.toString(16).toUpperCase()).slice(-8);
117
+ }
118
+ });
119
+ Object.defineProperty(Tag.prototype, "getValue", {
120
+ enumerable: false,
121
+ configurable: true,
122
+ writable: true,
123
+ value: function () {
124
+ }
125
+ });
126
+ return Tag;
127
+ }());
128
+ export default Tag;
package/Value.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ declare class Value {
2
+ static byVr(dataView: DataView, offset: number, len: number, vr: string, littleEndian: boolean): string | number | DataView | (string | number)[] | undefined;
3
+ static CS(dataView: DataView, offset: number, len: number): string | string[];
4
+ static IS(dataView: DataView, offset: number, len: number): string | number;
5
+ static DA(dataView: DataView, offset: number, len: number): string;
6
+ static DS(dataView: DataView, offset: number, len: number): string | number | (string | number)[];
7
+ static TM(dataView: DataView, offset: number, len: number): string;
8
+ static US(dataView: DataView, offset: number, len: number, littleEndian?: boolean): number | undefined;
9
+ static OW(dataView: DataView, offset: number, len: number): DataView;
10
+ static getString(bytes: Uint8Array | Int8Array | ArrayBuffer): string;
11
+ }
12
+ export default Value;