in pathology/viewer/src/services/slide-api.service.ts [55:121]
private computeLevel(dicomModel: DicomModel, isFlatImage: boolean): Level {
let frames =
dicomModel[DicomTag.NUMBER_OF_FRAMES]?.Value?.[0] as number;
let height = Number(
dicomModel?.[DicomTag.TOTAL_PIXEL_MATRIX_ROWS]?.Value ?? NaN);
let width = Number(
dicomModel?.[DicomTag.TOTAL_PIXEL_MATRIX_COLUMNS]?.Value ?? NaN);
const tileSize = Math.max(
Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? undefined),
Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? undefined));
const instanceUid =
dicomModel[DicomTag.SOP_INSTANCE_UID]?.Value?.[0] as string;
const offset = (dicomModel[DicomTag.OFFSET]?.Value?.[0] ?? 0) as number;
const physicalWidthMillimeters =
Number(dicomModel[DicomTag.IMAGE_VOLUME_WIDTH]?.Value ?? NaN);
const physicalHeightMillimeters =
Number(dicomModel[DicomTag.IMAGE_VOLUME_HEIGHT]?.Value ?? NaN);
let pixelWidth: number | undefined = physicalWidthMillimeters / width;
let pixelHeight: number | undefined = physicalHeightMillimeters / height;
if ((!Number.isFinite(pixelWidth) || !Number.isFinite(pixelHeight)) &&
dicomModel[DicomTag.PIXEL_SPACING]?.Value?.length === 2) {
const ps = dicomModel[DicomTag.PIXEL_SPACING].Value;
pixelWidth = Number(ps[0]);
pixelHeight = Number(ps[1]);
}
pixelWidth =
!pixelWidth || !Number.isFinite(pixelWidth) ? undefined : pixelWidth;
pixelHeight =
!pixelHeight || !Number.isFinite(pixelHeight) ? undefined : pixelHeight;
if (isFlatImage) {
frames = 1;
height = Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? undefined);
width = Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? undefined);
}
// ⌈NumberOfFrames * tile width * tile height * Samples Per Pixel *
// ⌈Allocated Bits Stored / 8⌉ / LossImageCompressionRatio⌉
const storedBytes = Math.ceil(
Number(dicomModel?.[DicomTag.ROWS]?.Value?.[0] ?? NaN) *
Number(dicomModel?.[DicomTag.COLS]?.Value?.[0] ?? NaN) * frames *
Number(dicomModel?.[DicomTag.SAMPLES_PER_PIXEL]?.Value?.[0] ?? NaN) *
Math.ceil(
Number(dicomModel?.[DicomTag.BITS_ALLOCATED]?.Value?.[0] ?? NaN) /
8) /
Number(
dicomModel?.[DicomTag.LOSSY_IMAGE_COMPRESSION_RATIO]?.Value?.[0] ??
1 /* uncompressed */));
return {
properties: [{
offset,
frames,
instanceUid,
}],
width,
height,
pixelWidth,
pixelHeight,
tileSize,
zoom: 0, // unknown at this point
storedBytes,
dicomModel,
};
}