@abasb75/dicom-parser 0.0.6-test → 0.0.20
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/README.md +33 -48
- package/dist/index.d.mts +137 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/package.json +25 -33
- package/Dataset.d.ts +0 -52
- package/Dataset.js +0 -320
- package/Draw.d.ts +0 -8
- package/Draw.js +0 -54
- package/Loader.d.ts +0 -8
- package/Loader.js +0 -63
- package/Parser.d.ts +0 -29
- package/Parser.js +0 -241
- package/PixelData.d.ts +0 -8
- package/PixelData.js +0 -79
- package/Tag.d.ts +0 -17
- package/Tag.js +0 -97
- package/Utitlities.d.ts +0 -12
- package/Utitlities.js +0 -19
- package/Value.d.ts +0 -12
- package/Value.js +0 -103
- package/decoder/JPEG2000.d.ts +0 -5
- package/decoder/JPEG2000.js +0 -10
- package/decoder/Uncompressed.d.ts +0 -6
- package/decoder/Uncompressed.js +0 -57
- package/decoder/decodes/jpx.d.ts +0 -1
- package/decoder/decodes/jpx.js +0 -1
- package/enums/TagsDictionary.d.ts +0 -8
- package/enums/TagsDictionary.js +0 -3610
- package/enums/TransferSyntax.d.ts +0 -17
- package/enums/TransferSyntax.js +0 -17
- package/enums/ValueRepresentations.d.ts +0 -2
- package/enums/ValueRepresentations.js +0 -2
- package/enums/index.d.ts +0 -12
- package/enums/index.js +0 -9
- package/index.d.ts +0 -10
- package/index.js +0 -48
- package/tsconfig.tsbuildinfo +0 -1
- package/types.d.ts +0 -60
- package/types.js +0 -1
package/Parser.js
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import Dataset from "./Dataset";
|
|
2
|
-
import Tag from "./Tag";
|
|
3
|
-
import Value from "./Value";
|
|
4
|
-
import * as pako from "pako";
|
|
5
|
-
class Parser {
|
|
6
|
-
constructor(arrayBuffer) {
|
|
7
|
-
Object.defineProperty(this, "arrayBuffer", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
configurable: true,
|
|
10
|
-
writable: true,
|
|
11
|
-
value: void 0
|
|
12
|
-
});
|
|
13
|
-
Object.defineProperty(this, "offset", {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
configurable: true,
|
|
16
|
-
writable: true,
|
|
17
|
-
value: void 0
|
|
18
|
-
});
|
|
19
|
-
Object.defineProperty(this, "dataView", {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true,
|
|
23
|
-
value: void 0
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(this, "tags", {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
configurable: true,
|
|
28
|
-
writable: true,
|
|
29
|
-
value: {}
|
|
30
|
-
});
|
|
31
|
-
Object.defineProperty(this, "dataSet", {
|
|
32
|
-
enumerable: true,
|
|
33
|
-
configurable: true,
|
|
34
|
-
writable: true,
|
|
35
|
-
value: void 0
|
|
36
|
-
});
|
|
37
|
-
Object.defineProperty(this, "EXEPTED", {
|
|
38
|
-
enumerable: true,
|
|
39
|
-
configurable: true,
|
|
40
|
-
writable: true,
|
|
41
|
-
value: ["OB", "OW", "SQ", "UN", "UT"]
|
|
42
|
-
});
|
|
43
|
-
Object.defineProperty(this, "VRS", {
|
|
44
|
-
enumerable: true,
|
|
45
|
-
configurable: true,
|
|
46
|
-
writable: true,
|
|
47
|
-
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"]
|
|
48
|
-
});
|
|
49
|
-
Object.defineProperty(this, "IMPLICT_TRANSFER_SYNTAXES", {
|
|
50
|
-
enumerable: true,
|
|
51
|
-
configurable: true,
|
|
52
|
-
writable: true,
|
|
53
|
-
value: ["1.2.840.10008.1.2"]
|
|
54
|
-
});
|
|
55
|
-
Object.defineProperty(this, "BIG_ENDIAN_TRANSFER_SYNTAXES", {
|
|
56
|
-
enumerable: true,
|
|
57
|
-
configurable: true,
|
|
58
|
-
writable: true,
|
|
59
|
-
value: ["1.2.840.10008.1.2.2"]
|
|
60
|
-
});
|
|
61
|
-
Object.defineProperty(this, "DEFLATED_TRANSFER_SYNTAXES", {
|
|
62
|
-
enumerable: true,
|
|
63
|
-
configurable: true,
|
|
64
|
-
writable: true,
|
|
65
|
-
value: ["1.2.840.10008.1.2.1.99"]
|
|
66
|
-
});
|
|
67
|
-
Object.defineProperty(this, "littleEndian", {
|
|
68
|
-
enumerable: true,
|
|
69
|
-
configurable: true,
|
|
70
|
-
writable: true,
|
|
71
|
-
value: true
|
|
72
|
-
});
|
|
73
|
-
Object.defineProperty(this, "implicit", {
|
|
74
|
-
enumerable: true,
|
|
75
|
-
configurable: true,
|
|
76
|
-
writable: true,
|
|
77
|
-
value: false
|
|
78
|
-
});
|
|
79
|
-
Object.defineProperty(this, "transferSyntaxUID", {
|
|
80
|
-
enumerable: true,
|
|
81
|
-
configurable: true,
|
|
82
|
-
writable: true,
|
|
83
|
-
value: ""
|
|
84
|
-
});
|
|
85
|
-
// private UNDEFIENED_LEN:number = 0xffffffff;
|
|
86
|
-
Object.defineProperty(this, "inflated", {
|
|
87
|
-
enumerable: true,
|
|
88
|
-
configurable: true,
|
|
89
|
-
writable: true,
|
|
90
|
-
value: false
|
|
91
|
-
});
|
|
92
|
-
Object.defineProperty(this, "concatArrayBuffers", {
|
|
93
|
-
enumerable: true,
|
|
94
|
-
configurable: true,
|
|
95
|
-
writable: true,
|
|
96
|
-
value: function (buffer1, buffer2) {
|
|
97
|
-
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
|
|
98
|
-
tmp.set(new Uint8Array(buffer1), 0);
|
|
99
|
-
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
|
|
100
|
-
return tmp.buffer;
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this.offset = 0;
|
|
104
|
-
this.arrayBuffer = arrayBuffer;
|
|
105
|
-
this.dataView = new DataView(arrayBuffer);
|
|
106
|
-
if (this.arrayBuffer.byteLength < 132) {
|
|
107
|
-
console.error("is not valid dicom file");
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
const prefix = Value.getString(new Uint8Array(arrayBuffer, 128, 4));
|
|
111
|
-
if (prefix !== 'DICM') {
|
|
112
|
-
console.error("is not valid dicom file");
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
this.offset = 132;
|
|
116
|
-
this.parse();
|
|
117
|
-
}
|
|
118
|
-
parse() {
|
|
119
|
-
this.getNextElement();
|
|
120
|
-
this.dataSet = new Dataset(this.tags, this.dataView, this.littleEndian);
|
|
121
|
-
console.log(this.dataSet);
|
|
122
|
-
this.dataSet.transferSyntaxUID = this.transferSyntaxUID;
|
|
123
|
-
return this.dataSet;
|
|
124
|
-
}
|
|
125
|
-
getDataset() {
|
|
126
|
-
return this.dataSet;
|
|
127
|
-
}
|
|
128
|
-
getNextElement() {
|
|
129
|
-
if (this.offset >= this.arrayBuffer.byteLength) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const { group, element } = this.getNextGroupAndElement();
|
|
133
|
-
if (!group && !element) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
if (group === 0xFFFE && (element === 0xE0DD || element === 0xE00D || element === 0xE000)) {
|
|
137
|
-
this.offset += 4;
|
|
138
|
-
return this.getNextElement();
|
|
139
|
-
}
|
|
140
|
-
if (!this.implicit && group !== 0x0002 && this.IMPLICT_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
|
|
141
|
-
this.implicit = true;
|
|
142
|
-
}
|
|
143
|
-
if (this.littleEndian && group !== 0x0002 && this.BIG_ENDIAN_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
|
|
144
|
-
this.littleEndian = false;
|
|
145
|
-
}
|
|
146
|
-
if (!this.inflated && group !== 0x0002 && this.DEFLATED_TRANSFER_SYNTAXES.includes(this.transferSyntaxUID)) {
|
|
147
|
-
this.offset -= 4;
|
|
148
|
-
const meta = this.dataView.buffer.slice(0, this.offset);
|
|
149
|
-
const body = this.dataView.buffer.slice(this.offset);
|
|
150
|
-
const infaltedBody = pako.inflateRaw(body);
|
|
151
|
-
this.arrayBuffer = this.concatArrayBuffers(meta, infaltedBody);
|
|
152
|
-
this.dataView = new DataView(this.arrayBuffer);
|
|
153
|
-
this.inflated = true;
|
|
154
|
-
return this.getNextElement();
|
|
155
|
-
}
|
|
156
|
-
const vr = this.getNextVR(group, element);
|
|
157
|
-
let len = 0;
|
|
158
|
-
if (this.implicit) {
|
|
159
|
-
len = this.dataView.getUint32(this.offset, this.littleEndian);
|
|
160
|
-
this.offset += 4;
|
|
161
|
-
}
|
|
162
|
-
else if (this.EXEPTED.includes(vr)) {
|
|
163
|
-
this.offset += 2; // skip 2 byte reserved
|
|
164
|
-
len = this.dataView.getUint32(this.offset, this.littleEndian);
|
|
165
|
-
this.offset += 4;
|
|
166
|
-
}
|
|
167
|
-
else if (this.VRS.includes(vr)) {
|
|
168
|
-
len = this.dataView.getUint16(this.offset, this.littleEndian);
|
|
169
|
-
this.offset += 2;
|
|
170
|
-
}
|
|
171
|
-
else if ((!vr || !vr.match(/^[A-Z]{2}$/)) && group === 0x0002 && element === 0x0000) {
|
|
172
|
-
console.log("pyz");
|
|
173
|
-
this.offset = 132;
|
|
174
|
-
this.tags = {};
|
|
175
|
-
this.implicit = true;
|
|
176
|
-
return this.getNextElement();
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
if (group === 0x0002 && element === 0x0010) {
|
|
182
|
-
this.transferSyntaxUID = (Value.getString(new Uint8Array(this.arrayBuffer, this.offset, len))).replace('\0', '');
|
|
183
|
-
}
|
|
184
|
-
const tag = new Tag(group, element, vr, len, this.offset);
|
|
185
|
-
const key = tag.generateKey();
|
|
186
|
-
this.tags[key] = tag;
|
|
187
|
-
if (len === 0xFFFFFFFF && group === 0x7FE0 && element === 0x0010) {
|
|
188
|
-
let { group, element } = this.getNextGroupAndElement();
|
|
189
|
-
while (true) {
|
|
190
|
-
if (group === 0xFFFE && element === 0xE000) {
|
|
191
|
-
const len = this.dataView.getUint32(this.offset, this.littleEndian);
|
|
192
|
-
this.offset += 4;
|
|
193
|
-
const t = this.getNextGroupAndElement();
|
|
194
|
-
group = t.group;
|
|
195
|
-
element = t.element;
|
|
196
|
-
this.offset += len;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
this.offset -= 4;
|
|
203
|
-
}
|
|
204
|
-
if (vr === "SQ") {
|
|
205
|
-
this.getNextElement();
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
this.offset += len;
|
|
209
|
-
this.getNextElement();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
getValue(len) {
|
|
213
|
-
const value = this.arrayBuffer.slice(this.offset, len);
|
|
214
|
-
this.offset += len;
|
|
215
|
-
return value;
|
|
216
|
-
}
|
|
217
|
-
getNextGroupAndElement() {
|
|
218
|
-
try {
|
|
219
|
-
const group = this.dataView.getUint16(this.offset, this.littleEndian);
|
|
220
|
-
this.offset += 2;
|
|
221
|
-
const element = this.dataView.getUint16(this.offset, this.littleEndian);
|
|
222
|
-
this.offset += 2;
|
|
223
|
-
return { group, element };
|
|
224
|
-
}
|
|
225
|
-
catch (_a) {
|
|
226
|
-
return { group: 0, element: 0 };
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
getNextVR(groupInt, elementInt) {
|
|
230
|
-
if (this.offset >= this.dataView.byteLength) {
|
|
231
|
-
return "";
|
|
232
|
-
}
|
|
233
|
-
if (this.implicit) {
|
|
234
|
-
return Tag.getTagVRFromDictionary(groupInt, elementInt) || "AA";
|
|
235
|
-
}
|
|
236
|
-
const vr = Value.getString(new Uint8Array(this.arrayBuffer, this.offset, 2));
|
|
237
|
-
this.offset += 2;
|
|
238
|
-
return vr;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
export default Parser;
|
package/PixelData.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import Dataset from "./Dataset";
|
|
2
|
-
declare class PixelData {
|
|
3
|
-
static get(dataset: Dataset): import("./types").PixelArray[];
|
|
4
|
-
private static _getUncompressed;
|
|
5
|
-
private static _getJPEG2000ImageCompression_LosslessOnly;
|
|
6
|
-
private static _getixelDataViews;
|
|
7
|
-
}
|
|
8
|
-
export default PixelData;
|
package/PixelData.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import JPEG2000 from "./decoder/JPEG2000";
|
|
2
|
-
import UncompressDecoderr from "./decoder/Uncompressed";
|
|
3
|
-
class PixelData {
|
|
4
|
-
static get(dataset) {
|
|
5
|
-
const transferSyntaxUID = dataset.transferSyntaxUID;
|
|
6
|
-
switch (transferSyntaxUID) {
|
|
7
|
-
case "1.2.840.10008.1.2.4.90":
|
|
8
|
-
return PixelData._getJPEG2000ImageCompression_LosslessOnly(dataset);
|
|
9
|
-
case "1.2.840.10008.1.2":
|
|
10
|
-
case "1.2.840.10008.1.2.1":
|
|
11
|
-
case "1.2.840.10008.1.2.2":
|
|
12
|
-
case "1.2.840.10008.1.2.1.99":
|
|
13
|
-
default:
|
|
14
|
-
return PixelData._getUncompressed(dataset);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
static _getUncompressed(dataset) {
|
|
18
|
-
const bitsAllocated = dataset.pixelModule.bitsAllocated || 1;
|
|
19
|
-
const pixelRepresentation = dataset.pixelModule.pixelRepresentation || 0;
|
|
20
|
-
const pixelDataViews = PixelData._getixelDataViews(dataset);
|
|
21
|
-
return pixelDataViews.map((dataView) => {
|
|
22
|
-
return UncompressDecoderr.decode({
|
|
23
|
-
pixelData: dataView,
|
|
24
|
-
bitsAllocated,
|
|
25
|
-
pixelRepresentation,
|
|
26
|
-
littleEndian: dataset.littleEndian,
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
static _getJPEG2000ImageCompression_LosslessOnly(dataset) {
|
|
31
|
-
const pixelDataViews = PixelData._getixelDataViews(dataset);
|
|
32
|
-
return pixelDataViews.map((dataView) => {
|
|
33
|
-
return JPEG2000.decode({
|
|
34
|
-
pixelData: dataView,
|
|
35
|
-
bitsAllocated: dataset.pixelModule.bitsAllocated || 1,
|
|
36
|
-
pixelRepresentation: dataset.pixelModule.pixelRepresentation || 0,
|
|
37
|
-
littleEndian: dataset.littleEndian,
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
static _getixelDataViews(dataset) {
|
|
42
|
-
const pixelData = dataset.tags['0x7FE00010'] || dataset.tags['0x7FE00008'] || dataset.tags['0x7FE00009'];
|
|
43
|
-
const pixelDatas = [];
|
|
44
|
-
const numberOfFrames = dataset.pixelModule.numberOfFrames || 1;
|
|
45
|
-
if (pixelData.valueLength === 0xFFFFFFFF) {
|
|
46
|
-
let offset = pixelData.offset;
|
|
47
|
-
while (true) {
|
|
48
|
-
if (offset >= dataset.dataView.byteLength) {
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
const group = dataset.dataView.getUint16(offset, dataset.littleEndian);
|
|
52
|
-
offset += 2;
|
|
53
|
-
const element = dataset.dataView.getUint16(offset, dataset.littleEndian);
|
|
54
|
-
offset += 2;
|
|
55
|
-
if (group !== 0xFFFE && element !== 0xE000) {
|
|
56
|
-
break;
|
|
57
|
-
;
|
|
58
|
-
}
|
|
59
|
-
const len = dataset.dataView.getUint32(offset, dataset.littleEndian);
|
|
60
|
-
offset += 4;
|
|
61
|
-
if (len !== 0) {
|
|
62
|
-
const dataView = new DataView(dataset.dataView.buffer, offset, len);
|
|
63
|
-
pixelDatas.push(dataView);
|
|
64
|
-
offset += len;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
const frameLen = pixelData.valueLength / numberOfFrames;
|
|
70
|
-
for (let i = 0; i < numberOfFrames; i++) {
|
|
71
|
-
const offset = pixelData.offset + (frameLen * i);
|
|
72
|
-
const dataView = new DataView(dataset.dataView.buffer, offset, frameLen);
|
|
73
|
-
pixelDatas.push(dataView);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return pixelDatas;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export default PixelData;
|
package/Tag.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import TagsDictionaryEnums from "./enums/TagsDictionary";
|
|
2
|
-
class Tag {
|
|
3
|
-
constructor(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
|
-
generateKey() {
|
|
57
|
-
const group = Tag.intTo4digitString(this.group);
|
|
58
|
-
const element = Tag.intTo4digitString(this.element);
|
|
59
|
-
return `0x${group}${element}`;
|
|
60
|
-
}
|
|
61
|
-
static getTagNameFromDictionary(groupInt, elementInt) {
|
|
62
|
-
const group = Tag.intTo4digitString(groupInt);
|
|
63
|
-
const element = Tag.intTo4digitString(elementInt);
|
|
64
|
-
const groupItems = TagsDictionaryEnums[group];
|
|
65
|
-
if (!groupItems)
|
|
66
|
-
return "";
|
|
67
|
-
const elementItem = groupItems[element];
|
|
68
|
-
if (!elementItem)
|
|
69
|
-
return "";
|
|
70
|
-
return elementItem[1];
|
|
71
|
-
}
|
|
72
|
-
static getTagVRFromDictionary(group, element) {
|
|
73
|
-
let _group, _element;
|
|
74
|
-
if (typeof group === "number") {
|
|
75
|
-
_group = Tag.intTo4digitString(group);
|
|
76
|
-
}
|
|
77
|
-
if (typeof element === "number") {
|
|
78
|
-
_element = Tag.intTo4digitString(element);
|
|
79
|
-
}
|
|
80
|
-
const groupItems = TagsDictionaryEnums[_group || group];
|
|
81
|
-
if (!groupItems)
|
|
82
|
-
return "";
|
|
83
|
-
const elementItem = groupItems[_element || element];
|
|
84
|
-
if (!elementItem)
|
|
85
|
-
return "";
|
|
86
|
-
return elementItem[0];
|
|
87
|
-
}
|
|
88
|
-
static intTo4digitString(int) {
|
|
89
|
-
return ('0000' + int.toString(16).toUpperCase()).slice(-4);
|
|
90
|
-
}
|
|
91
|
-
static int8digitString(int) {
|
|
92
|
-
return ('00000000' + int.toString(16).toUpperCase()).slice(-8);
|
|
93
|
-
}
|
|
94
|
-
getValue() {
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
export default Tag;
|
package/Utitlities.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { PixelArray } from "./types";
|
|
2
|
-
declare class Utilities {
|
|
3
|
-
static getMinMax(pixelData: PixelArray): {
|
|
4
|
-
min: number;
|
|
5
|
-
max: number;
|
|
6
|
-
};
|
|
7
|
-
static getLUTwithMinMax(min: number, max: number): {
|
|
8
|
-
windowWidth: number;
|
|
9
|
-
windowCenter: number;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
export default Utilities;
|
package/Utitlities.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
class Utilities {
|
|
2
|
-
static getMinMax(pixelData) {
|
|
3
|
-
let min = pixelData[0];
|
|
4
|
-
let max = pixelData[0];
|
|
5
|
-
for (let i = 0; i < pixelData.length; i++) {
|
|
6
|
-
if (pixelData[i] < min)
|
|
7
|
-
min = pixelData[i];
|
|
8
|
-
if (pixelData[i] > max)
|
|
9
|
-
max = pixelData[i];
|
|
10
|
-
}
|
|
11
|
-
return { min, max };
|
|
12
|
-
}
|
|
13
|
-
static getLUTwithMinMax(min, max) {
|
|
14
|
-
const windowWidth = max - min;
|
|
15
|
-
const windowCenter = min + windowWidth / 2;
|
|
16
|
-
return { windowWidth, windowCenter };
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export default Utilities;
|
package/Value.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
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;
|
package/Value.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
class Value {
|
|
2
|
-
static byVr(dataView, offset, len, vr, littleEndian) {
|
|
3
|
-
switch (vr) {
|
|
4
|
-
case "CS":
|
|
5
|
-
return Value.CS(dataView, offset, len);
|
|
6
|
-
case "US":
|
|
7
|
-
return Value.US(dataView, offset, len, littleEndian);
|
|
8
|
-
case "IS":
|
|
9
|
-
return Value.IS(dataView, offset, len);
|
|
10
|
-
case "DS":
|
|
11
|
-
return Value.DS(dataView, offset, len);
|
|
12
|
-
case "DA":
|
|
13
|
-
return Value.DA(dataView, offset, len);
|
|
14
|
-
case "TM":
|
|
15
|
-
return Value.TM(dataView, offset, len);
|
|
16
|
-
case "OW":
|
|
17
|
-
case "OB":
|
|
18
|
-
case "OD":
|
|
19
|
-
case "OF":
|
|
20
|
-
return Value.OW(dataView, offset, len);
|
|
21
|
-
case "UI":
|
|
22
|
-
case "SH":
|
|
23
|
-
case "LO":
|
|
24
|
-
default:
|
|
25
|
-
return Value.getString(new Uint8Array(dataView.buffer, offset, len));
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
static CS(dataView, offset, len) {
|
|
29
|
-
let value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
|
|
30
|
-
const values = value.split("\\");
|
|
31
|
-
if (values.length === 0) {
|
|
32
|
-
return value;
|
|
33
|
-
}
|
|
34
|
-
else if (values.length === 1) {
|
|
35
|
-
return values[0];
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
return values;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
static IS(dataView, offset, len) {
|
|
42
|
-
const value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
|
|
43
|
-
if (/^[0-9]+$/.exec(value)) {
|
|
44
|
-
return parseInt(value);
|
|
45
|
-
}
|
|
46
|
-
return value;
|
|
47
|
-
}
|
|
48
|
-
static DA(dataView, offset, len) {
|
|
49
|
-
const value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
|
|
50
|
-
if (/^[0-9]{8}$/.exec(value)) {
|
|
51
|
-
return `${value.slice(0, 4)}-${value.slice(4, 6)}-${value.slice(6, 8)}`;
|
|
52
|
-
}
|
|
53
|
-
return value;
|
|
54
|
-
}
|
|
55
|
-
static DS(dataView, offset, len) {
|
|
56
|
-
let value = Value.getString(new Uint8Array(dataView.buffer, offset, len));
|
|
57
|
-
const values = value.split("\\").map(v => {
|
|
58
|
-
if (/^[0-9\-\+]+$/.exec(v)) {
|
|
59
|
-
return parseInt(v);
|
|
60
|
-
}
|
|
61
|
-
else if (/^[0-9\-\+]+\.[0-9]+$/.exec(v)) {
|
|
62
|
-
return parseFloat(v);
|
|
63
|
-
}
|
|
64
|
-
return v;
|
|
65
|
-
});
|
|
66
|
-
if (values.length === 0) {
|
|
67
|
-
return value;
|
|
68
|
-
}
|
|
69
|
-
else if (values.length === 1) {
|
|
70
|
-
return values[0];
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
return values;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
static TM(dataView, offset, len) {
|
|
77
|
-
let value = Value.getString(new Uint8Array(dataView.buffer, offset, len)).trim().split('.')[0];
|
|
78
|
-
if (![2, 4, 6].includes(value.length)) {
|
|
79
|
-
return value;
|
|
80
|
-
}
|
|
81
|
-
if (value.length === 4) {
|
|
82
|
-
value += "00";
|
|
83
|
-
}
|
|
84
|
-
else if (value.length === 2) {
|
|
85
|
-
value += "0000";
|
|
86
|
-
}
|
|
87
|
-
return `${value.slice(0, 2)}:${value.slice(2, 4)}:${value.slice(4, 6)}`;
|
|
88
|
-
}
|
|
89
|
-
static US(dataView, offset, len, littleEndian = true) {
|
|
90
|
-
if (len === 2) {
|
|
91
|
-
return dataView.getUint16(offset, littleEndian);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
static OW(dataView, offset, len) {
|
|
95
|
-
const buffer = dataView.buffer.slice(offset, len);
|
|
96
|
-
return new DataView(buffer);
|
|
97
|
-
}
|
|
98
|
-
static getString(bytes) {
|
|
99
|
-
const decoder = new TextDecoder();
|
|
100
|
-
return decoder.decode(bytes).trim();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
export default Value;
|
package/decoder/JPEG2000.d.ts
DELETED
package/decoder/JPEG2000.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
class JPEG2000 {
|
|
2
|
-
static decode(options) {
|
|
3
|
-
console.log("ddss");
|
|
4
|
-
// let arrayBuffer = options.pixelData.buffer;
|
|
5
|
-
// let offset = options.pixelData.byteOffset;
|
|
6
|
-
// const length = options.pixelData.byteLength;
|
|
7
|
-
return new Uint8Array(options.pixelData.buffer);
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export default JPEG2000;
|
package/decoder/Uncompressed.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
class UncompressDecoderr {
|
|
2
|
-
static decode(options) {
|
|
3
|
-
let arrayBuffer = options.pixelData.buffer;
|
|
4
|
-
let offset = options.pixelData.byteOffset;
|
|
5
|
-
const length = options.pixelData.byteLength;
|
|
6
|
-
switch (options.bitsAllocated) {
|
|
7
|
-
case 8:
|
|
8
|
-
return UncompressDecoderr._endianFixer(new Uint8Array(arrayBuffer, offset, length), !options.littleEndian);
|
|
9
|
-
case 16:
|
|
10
|
-
if (options.pixelRepresentation === 0) {
|
|
11
|
-
return UncompressDecoderr._endianFixer(new Uint16Array(arrayBuffer, offset, length / 2), !options.littleEndian);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
return UncompressDecoderr._endianFixer(new Int16Array(arrayBuffer, offset, length / 2), !options.littleEndian);
|
|
15
|
-
}
|
|
16
|
-
case 32:
|
|
17
|
-
return UncompressDecoderr._endianFixer(new Float32Array(arrayBuffer, offset, length / 4), !options.littleEndian);
|
|
18
|
-
default:
|
|
19
|
-
return new Uint8Array(arrayBuffer);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
static _endianFixer(data, bigEndian = false) {
|
|
23
|
-
if (!bigEndian) {
|
|
24
|
-
return data;
|
|
25
|
-
}
|
|
26
|
-
if (data instanceof Uint16Array) {
|
|
27
|
-
const _data = new Uint16Array(data.length);
|
|
28
|
-
for (let i = 0; i < _data.length; i++) {
|
|
29
|
-
_data[i] = ((data[i] & 0xFF) << 8) | ((data[i] >> 8) & 0xF);
|
|
30
|
-
}
|
|
31
|
-
return _data;
|
|
32
|
-
}
|
|
33
|
-
else if (data instanceof Int16Array) {
|
|
34
|
-
const _data = new Int16Array(data.length);
|
|
35
|
-
for (let i = 0; i < _data.length; i++) {
|
|
36
|
-
_data[i] = ((data[i] & 0xFF) << 8) | ((data[i] >> 8) & 0xF);
|
|
37
|
-
}
|
|
38
|
-
return _data;
|
|
39
|
-
}
|
|
40
|
-
else if (data instanceof Uint32Array) {
|
|
41
|
-
const _data = new Uint32Array(data.length);
|
|
42
|
-
for (let i = 0; i < _data.length; i++) {
|
|
43
|
-
_data[i] = ((data[i] & 0xFF) << 24) | ((data[i] & 0xFF00) << 8) | ((data[i] >> 8) & 0xFF00) | ((data[i] >> 24) & 0xFF);
|
|
44
|
-
}
|
|
45
|
-
return _data;
|
|
46
|
-
}
|
|
47
|
-
else if (data instanceof Float32Array) {
|
|
48
|
-
const _data = new Float32Array(data.length);
|
|
49
|
-
for (let i = 0; i < _data.length; i++) {
|
|
50
|
-
_data[i] = ((data[i] & 0xFF) << 24) | ((data[i] & 0xFF00) << 8) | ((data[i] >> 8) & 0xFF00) | ((data[i] >> 24) & 0xFF);
|
|
51
|
-
}
|
|
52
|
-
return _data;
|
|
53
|
-
}
|
|
54
|
-
return data;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export default UncompressDecoderr;
|
package/decoder/decodes/jpx.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/decoder/decodes/jpx.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|