64 lines
2.6 KiB
Plaintext
64 lines
2.6 KiB
Plaintext
import dicomParser from "dicom-parser";
|
|
import dcmjs from 'dcmjs'
|
|
const CharLs = require('@cornerstonejs/codec-charls')
|
|
const codecWrapper = {
|
|
codec: undefined,
|
|
Decoder: undefined,
|
|
Encoder: undefined,
|
|
encoderName: "JpegLSEncoder",
|
|
decoderName: "JpegLSDecoder",
|
|
};
|
|
function setCodec(codecConfig, encoderName, decoderName, codec = {}) {
|
|
codecConfig.Encoder = codec[encoderName];
|
|
codecConfig.Decoder = codec[decoderName];
|
|
codecConfig.codec = codec;
|
|
}
|
|
CharLs().then(res => {
|
|
setCodec(codecWrapper, codecWrapper.encoderName, codecWrapper.decoderName, res);
|
|
})
|
|
|
|
export const encoder = function (file) {
|
|
return new Promise(async (resolve, reject) => {
|
|
try {
|
|
const reader = new FileReader();
|
|
reader.onload = async (event) => {
|
|
let buffer = event.target.result;
|
|
let data = dicomParser.parseDicom(new Uint8Array(buffer))
|
|
let height = data.uint16('x00280011')
|
|
let width = data.uint16('x00280010')
|
|
let bitsPerSample = data.uint16('x00280100')
|
|
let componentCount = data.string('x00280004')
|
|
let transportSyntax = data.string('x00020010')
|
|
console.log(transportSyntax, componentCount)
|
|
if ((transportSyntax === '1.2.840.10008.1.2.1' || transportSyntax === '1.2.840.10008.1.2') && ~componentCount.indexOf('MONOCHROME')) {
|
|
let dataset = dcmjs.data.DicomMessage.readFile(buffer)
|
|
let pixelDataElement = data.elements.x7fe00010;
|
|
let pixelDataOffset = pixelDataElement.dataOffset;
|
|
let pixelDataLength = pixelDataElement.length;
|
|
let pixelDataBytes = data.byteArray.subarray(pixelDataOffset, pixelDataOffset + pixelDataLength)
|
|
let encoder = new codecWrapper.Encoder();
|
|
let decodedBytes = encoder.getDecodedBuffer({width: width, height: height, bitsPerSample: bitsPerSample, componentCount: 1})
|
|
encoder.setNearLossless(0);
|
|
decodedBytes.set(pixelDataBytes);
|
|
encoder.encode()
|
|
let encodedBytes = encoder.getEncodedBuffer();
|
|
dataset.dict['7FE00010'].Value[0] = encodedBytes.buffer;
|
|
dataset.meta['00020010'].Value[0] = '1.2.840.10008.1.2.4.80';
|
|
let newDicomFile = dataset.write();
|
|
const bufferArray = new Uint8Array(newDicomFile);
|
|
const blob = new Blob([bufferArray], { type: 'application/octet-stream' });
|
|
resolve(blob)
|
|
} else {
|
|
const bufferArray = new Uint8Array(buffer);
|
|
const blob = new Blob([bufferArray], { type: 'application/octet-stream' });
|
|
resolve(blob)
|
|
}
|
|
};
|
|
reader.readAsArrayBuffer(file);
|
|
} catch (e) {
|
|
console.log(e)
|
|
reject(e)
|
|
}
|
|
})
|
|
}
|