@abasb75/dicom-parser 0.0.0-test2 → 0.0.0-test20

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,297 @@
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", "OD"]
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
+ this.offset = 132;
125
+ }
126
+ else {
127
+ // in some image (128 empty byte and DICM) does not exist.
128
+ // const {group} = this.getNextGroupAndElement();
129
+ // if(group!==0x0002){
130
+ // return;
131
+ // }
132
+ this.offset = 0;
133
+ }
134
+ this.parse();
135
+ }
136
+ Object.defineProperty(Parser.prototype, "parse", {
137
+ enumerable: false,
138
+ configurable: true,
139
+ writable: true,
140
+ value: function () {
141
+ this.tags = this.getElements();
142
+ this.end = Date.now();
143
+ this.dataSet = new Dataset(this.tags, this.dataView, this.littleEndian, this.start, this.end);
144
+ this.dataSet.transferSyntaxUID = this.transferSyntaxUID;
145
+ return this.dataSet;
146
+ }
147
+ });
148
+ Object.defineProperty(Parser.prototype, "getDataset", {
149
+ enumerable: false,
150
+ configurable: true,
151
+ writable: true,
152
+ value: function () {
153
+ return this.dataSet;
154
+ }
155
+ });
156
+ Object.defineProperty(Parser.prototype, "getElements", {
157
+ enumerable: false,
158
+ configurable: true,
159
+ writable: true,
160
+ value: function (sqLen) {
161
+ var tags = {};
162
+ var targetOfset = (sqLen !== undefined)
163
+ ? (this.offset + sqLen) : this.arrayBuffer.byteLength;
164
+ while (this.offset < targetOfset) {
165
+ var _a = this.getNextGroupAndElement(), group = _a.group, element = _a.element;
166
+ if (!group && !element) {
167
+ break;
168
+ }
169
+ if (sqLen && group === 0xFFFE && (element === 0xE00D || element === 0xE0DD)) {
170
+ this.offset += 4;
171
+ return tags;
172
+ }
173
+ if (group === 0xFFFE && (element === 0xE0DD || element === 0xE00D || element === 0xE000)) {
174
+ this.offset += 4;
175
+ continue;
176
+ }
177
+ if (!this.implicit && group !== 0x0002 && this.IMPLICT_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
178
+ this.implicit = true;
179
+ }
180
+ if (this.littleEndian && group !== 0x0002 && this.BIG_ENDIAN_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
181
+ this.littleEndian = false;
182
+ }
183
+ if (!this.inflated && group !== 0x0002 && this.DEFLATED_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
184
+ this.offset -= 4;
185
+ var meta = this.dataView.buffer.slice(0, this.offset);
186
+ var body = this.dataView.buffer.slice(this.offset);
187
+ var infaltedBody = pako.inflateRaw(body);
188
+ this.arrayBuffer = this.concatArrayBuffers(meta, infaltedBody);
189
+ this.dataView = new DataView(this.arrayBuffer);
190
+ this.inflated = true;
191
+ return this.getElements();
192
+ }
193
+ var vr = this.getNextVR(group, element);
194
+ var len = 0;
195
+ if (this.implicit) {
196
+ len = this.dataView.getUint32(this.offset, this.littleEndian);
197
+ this.offset += 4;
198
+ }
199
+ else if (this.EXEPTED.includes(vr)) {
200
+ this.offset += 2; // skip 2 byte reserved
201
+ len = this.dataView.getUint32(this.offset, this.littleEndian);
202
+ this.offset += 4;
203
+ }
204
+ else if (this.VRS.includes(vr)) {
205
+ len = this.dataView.getUint16(this.offset, this.littleEndian);
206
+ this.offset += 2;
207
+ }
208
+ else if ((!vr || !vr.match(/^[A-Z]{2}$/)) && group === 0x0002 && element === 0x0000) {
209
+ this.offset = 132;
210
+ this.tags = {};
211
+ this.implicit = true;
212
+ continue;
213
+ }
214
+ else {
215
+ this.offset -= 6;
216
+ this.implicit = true;
217
+ continue;
218
+ }
219
+ if (group === 0x0002 && element === 0x0010) {
220
+ this.transferSyntaxUID = (Value.getString(new Uint8Array(this.arrayBuffer, this.offset, len))).replace('\0', '');
221
+ }
222
+ var tag = new Tag(group, element, vr, len, this.offset);
223
+ if (len === 0xFFFFFFFF && group === 0x7FE0 && element === 0x0010) {
224
+ var _b = this.getNextGroupAndElement(), group_1 = _b.group, element_1 = _b.element;
225
+ while (true) {
226
+ if (group_1 === 0xFFFE && element_1 === 0xE000) {
227
+ var len_1 = this.dataView.getUint32(this.offset, this.littleEndian);
228
+ this.offset += 4;
229
+ var t = this.getNextGroupAndElement();
230
+ group_1 = t.group;
231
+ element_1 = t.element;
232
+ this.offset += len_1;
233
+ }
234
+ else {
235
+ break;
236
+ }
237
+ }
238
+ this.offset -= 4;
239
+ }
240
+ if (vr === "SQ") {
241
+ tag.value = this.getElements(len);
242
+ }
243
+ else {
244
+ this.offset += len;
245
+ }
246
+ var key = tag.generateKey();
247
+ tags[key] = tag;
248
+ }
249
+ return tags;
250
+ }
251
+ });
252
+ Object.defineProperty(Parser.prototype, "getValue", {
253
+ enumerable: false,
254
+ configurable: true,
255
+ writable: true,
256
+ value: function (len) {
257
+ var value = this.arrayBuffer.slice(this.offset, len);
258
+ this.offset += len;
259
+ return value;
260
+ }
261
+ });
262
+ Object.defineProperty(Parser.prototype, "getNextGroupAndElement", {
263
+ enumerable: false,
264
+ configurable: true,
265
+ writable: true,
266
+ value: function () {
267
+ try {
268
+ var group = this.dataView.getUint16(this.offset, this.littleEndian);
269
+ this.offset += 2;
270
+ var element = this.dataView.getUint16(this.offset, this.littleEndian);
271
+ this.offset += 2;
272
+ return { group: group, element: element };
273
+ }
274
+ catch (_a) {
275
+ return { group: 0, element: 0 };
276
+ }
277
+ }
278
+ });
279
+ Object.defineProperty(Parser.prototype, "getNextVR", {
280
+ enumerable: false,
281
+ configurable: true,
282
+ writable: true,
283
+ value: function (groupInt, elementInt) {
284
+ if (this.offset >= this.dataView.byteLength) {
285
+ return "";
286
+ }
287
+ if (this.implicit) {
288
+ return Tag.getTagVRFromDictionary(groupInt, elementInt) || "AA";
289
+ }
290
+ var vr = Value.getString(new Uint8Array(this.arrayBuffer, this.offset, 2));
291
+ this.offset += 2;
292
+ return vr;
293
+ }
294
+ });
295
+ return Parser;
296
+ }());
297
+ export default Parser;
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
 
@@ -69,4 +69,20 @@ const transferSyntaxUID = dataset.string(0x0002,0x0010);
69
69
 
70
70
  ...
71
71
 
72
+ const framePixelData = dataset.getPixelData(0); // requested frame number
73
+
74
+ ...
75
+
72
76
  ```
77
+
78
+ 6. get `palette color` map for `PALETTE COLOR` photometricInterpretation:
79
+
80
+ ```js
81
+ const paletteDataMap = dataset.getPaletteColorData();
82
+
83
+ if(paletteDataMap){
84
+ // apply palette color to pixels
85
+ ...
86
+ }
87
+
88
+ ````
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,15 @@
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 | number[] | undefined;
9
+ static SS(dataView: DataView, offset: number, len: number, littleEndian?: boolean): number | number[] | undefined;
10
+ static SL(dataView: DataView, offset: number, len: number, littleEndian?: boolean): number | number[] | undefined;
11
+ static UL(dataView: DataView, offset: number, len: number, littleEndian?: boolean): number | number[] | undefined;
12
+ static OW(dataView: DataView, offset: number, len: number): DataView;
13
+ static getString(bytes: Uint8Array | Int8Array | ArrayBuffer): string;
14
+ }
15
+ export default Value;