<main>
<h1>Image Energy Calculator</h1>
<p>
			Each pixel in an image consist of three “lamps”: red, green and blue.<br />
		If all “lamps” are fully on, the pixel is white – if they're off, it's black.<br />
		This tool shows the intensity of each “lamp” in an image.<br />
		High values equals high energy-cost (on OLED).<br />
		Darker images and “dark mode” saves electricity.
</p>
<div>Red: <strong id="R"></strong></div>
<div>Green: <strong id="G"></strong></div>
<div>Blue: <strong id="B"></strong></div>
<h2>Average: <span id="A"></span></h2>
<label>
	<input type="file" id="F" />
	Choose a file
</label>
</main>

<img id="I" src="" />
body {
	background-color: #222;
	color: #FEFEFE;
	display: flex;
  flex-direction: column;
	font-family: ui-sans-serif, system-ui, sans-serif;
	gap: 1rem;
  justify-content: space-between;
	line-height: 1.5;
	padding: 1rem 2rem;
}
img {
	border: 2px solid #FEFEFE;
	max-width: 20rem;
	object-fit: cover;
	width: 100%;
}
input {
	display: none;
}
label {
	border: 1px solid #FEFEFE;
	cursor: pointer;
	display: inline-flex;
	padding: 0.75rem 1.5rem;
}
@media (min-width: 768px) {
  body { flex-direction: row; }
}
I.onload = () => {
	const [r,g,b] = pixel2percent(I);
	const avg = Math.ceil((r+g+b) / 3);
	R.innerText = `${r}%`;
	G.innerText =`${g}%`;
	B.innerText = `${b}%`;
	A.innerText = `${avg}%`
}

function loadImg() {
	const reader = new FileReader();
		reader.onload = (e) => {
			I.setAttribute("src", e.target.result);
		};
		reader.readAsDataURL(event.target.files[0]);
}

function pixel2percent(img) {
	const width = img.width;
	const height = img.height;
	const canvas = document.createElement('canvas');
	canvas.width = width;
	canvas.height = height;
	const ctx = canvas.getContext('2d');
	ctx.drawImage(img, 0, 0, width, height);
	const imgData = ctx.getImageData(0, 0, width, height);
	
	const len = imgData.data.length / 4;

  let r = 0, g = 0, b = 0, a = 0;
	for (let i = 0; i < imgData.data.length; i += 4) {
		a = 255 / imgData.data[i + 3];
		r+= imgData.data[i] / 255 / a;
		g+= imgData.data[i + 1] / 255 / a;
		b+= imgData.data[i + 2] / 255 / a;
	}
	r = Math.floor((r/len) * 100);
	g = Math.floor((g/len) * 100);
	b = Math.floor((b/len) * 100);

	return [r, g, b];
}

F.addEventListener('change', loadImg);

/* Demo Init */
I.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAACFElEQVR4nO3TAQ2AQADEsAPjSAcD/BS0Epbs2p53wK9bFjgzCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg0AwCASDQDAIBINAMAgEg8DJtg9sfgMOlSm3aAAAAABJRU5ErkJggg==';

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.