|
|
|
import { loadPlane } from './zarr.js'; |
|
|
|
var canvas = document.getElementById('canvas'); |
|
var ctx = canvas.getContext('2d'); |
|
let width; |
|
let height; |
|
let sizeC = 3; |
|
let theZ = 2; |
|
let channelColors = ['blue', 'green', 'red']; |
|
let settings = [[5, 1430], [69, 2058], [55, 6259]]; |
|
let pixelData = []; |
|
|
|
const colors = {'red': 0, 'green': 1, 'blue': 2} |
|
|
|
function toRGBA(value, start, end, color) { |
|
let rgba = [0, 0, 0, 256]; |
|
let val = 256 * (value - start) / (end - start); |
|
rgba[colors[color]] = val; |
|
return rgba; |
|
} |
|
|
|
async function loadImage() { |
|
// load data... |
|
pixelData = []; |
|
let n = Date.now() |
|
for (let c=0; c< sizeC; c++) { |
|
let chunk = await loadPlane('52_plain.zarr', c, theZ); |
|
height = chunk.shape[0]; |
|
width = chunk.shape[1]; |
|
pixelData.push(chunk.data); |
|
console.log('loadImage time', Date.now() - n); |
|
} |
|
|
|
canvas.width = width; |
|
canvas.height = height; |
|
|
|
renderImage(); |
|
} |
|
|
|
function renderImage() { |
|
console.log('renderImage...'); |
|
|
|
updateChannelColors(); |
|
updateChannelSettings(); |
|
|
|
// render data... |
|
let n = Date.now(); |
|
let renderedData = new Uint8ClampedArray(height * width * 4); |
|
for (let i=0; i<width*height; i++) { |
|
let pixel = [0, 0, 0, 256]; |
|
for (let c=0; c < sizeC; c++) { |
|
const [start,end] = settings[c]; |
|
const color = channelColors[c]; |
|
let rgba = toRGBA(pixelData[c][i], start, end, color); |
|
pixel[0] += rgba[0]; |
|
pixel[1] += rgba[1]; |
|
pixel[2] += rgba[2]; |
|
} |
|
renderedData[i*4] = pixel[0]; |
|
renderedData[i*4 + 1] += pixel[1]; |
|
renderedData[i*4 + 2] += pixel[2]; |
|
renderedData[i*4 + 3] += pixel[3]; |
|
} |
|
console.log('renderData time', Date.now() - n); |
|
|
|
const myImageData = new ImageData(renderedData, width, height); |
|
ctx.putImageData(myImageData, 0, 0); |
|
console.log('putImageData time', Date.now() - n); |
|
} |
|
|
|
function updateChannelColors() { |
|
for (let c=0; c<sizeC; c++) { |
|
let color = 'red'; |
|
document.querySelectorAll(`input[name="ch${ c }color"]`).forEach(el => { |
|
if (el.checked) { |
|
color = el.value; |
|
} |
|
}); |
|
channelColors[c] = color; |
|
} |
|
} |
|
|
|
function updateChannelSettings() { |
|
for (let c=0; c<sizeC; c++) { |
|
let start = document.getElementById(`ch${ c }start`).value; |
|
let end = document.getElementById(`ch${ c }end`).value; |
|
settings[c] = [parseInt(start), parseInt(end)]; |
|
} |
|
} |
|
|
|
document.querySelectorAll('input').forEach(el => { |
|
if (el.id === 'zslider') { |
|
el.addEventListener('change', (e) => { |
|
theZ = parseInt(e.target.value); |
|
loadImage(); |
|
}); |
|
} else { |
|
el.addEventListener('input', (e) => renderImage()); |
|
} |
|
}); |
|
|
|
|
|
loadImage(); |
|
|