From cef4955de167d20f38588da594ecd21ea663f028 Mon Sep 17 00:00:00 2001 From: elioat Date: Sun, 18 Aug 2024 17:50:14 -0400 Subject: * --- js/lut-cam/lut-extraction/index.html | 25 ++++++++++ js/lut-cam/lut-extraction/sample.jpeg | Bin 0 -> 103831 bytes js/lut-cam/lut-extraction/script.js | 86 ++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 js/lut-cam/lut-extraction/index.html create mode 100644 js/lut-cam/lut-extraction/sample.jpeg create mode 100644 js/lut-cam/lut-extraction/script.js (limited to 'js/lut-cam/lut-extraction') diff --git a/js/lut-cam/lut-extraction/index.html b/js/lut-cam/lut-extraction/index.html new file mode 100644 index 0000000..4202e8f --- /dev/null +++ b/js/lut-cam/lut-extraction/index.html @@ -0,0 +1,25 @@ + + + + + + LUT Profile Extractor + + + +

LUT Profile Extractor

+ + + + Photograph of a colorful parrot. +

LUT Profile JS Code:

+

+    
+
+
diff --git a/js/lut-cam/lut-extraction/sample.jpeg b/js/lut-cam/lut-extraction/sample.jpeg
new file mode 100644
index 0000000..adea4b9
Binary files /dev/null and b/js/lut-cam/lut-extraction/sample.jpeg differ
diff --git a/js/lut-cam/lut-extraction/script.js b/js/lut-cam/lut-extraction/script.js
new file mode 100644
index 0000000..f4baeee
--- /dev/null
+++ b/js/lut-cam/lut-extraction/script.js
@@ -0,0 +1,86 @@
+document.getElementById('lut-upload').addEventListener('change', function(event) {
+    const file = event.target.files[0];
+    if (file) {
+        const reader = new FileReader();
+        reader.onload = function(e) {
+            const img = new Image();
+            img.src = e.target.result;
+            img.onload = function() {
+                const lutCanvas = document.getElementById('lut-preview');
+                const lutContext = lutCanvas.getContext('2d');
+                lutCanvas.width = img.width;
+                lutCanvas.height = img.height;
+                lutContext.drawImage(img, 0, 0);
+
+                const lutData = lutContext.getImageData(0, 0, lutCanvas.width, lutCanvas.height).data;
+                const lutWidth = img.width;
+                const lutHeight = img.height;
+                const lutSize = Math.cbrt(lutWidth * lutHeight);
+
+                const sampleImage = document.getElementById('sample-image');
+                sampleImage.onload = function() {
+                    applyLUTToSampleImage(lutData, lutWidth, lutHeight, lutSize);
+                };
+
+                if (sampleImage.complete) {
+                    applyLUTToSampleImage(lutData, lutWidth, lutHeight, lutSize);
+                }
+
+                outputLUTAsJSCode(lutData, lutWidth, lutHeight, lutSize);
+            };
+        };
+        reader.readAsDataURL(file);
+    }
+});
+
+function applyLUTToSampleImage(lutData, lutWidth, lutHeight, lutSize) {
+    const sampleImage = document.getElementById('sample-image');
+    const outputCanvas = document.getElementById('sample-output');
+    const outputContext = outputCanvas.getContext('2d');
+
+    outputCanvas.width = sampleImage.width;
+    outputCanvas.height = sampleImage.height;
+    outputContext.drawImage(sampleImage, 0, 0);
+
+    const imageData = outputContext.getImageData(0, 0, outputCanvas.width, outputCanvas.height);
+    const pixels = imageData.data;
+
+    for (let i = 0; i < pixels.length; i += 4) {
+        const r = pixels[i];
+        const g = pixels[i + 1];
+        const b = pixels[i + 2];
+
+        const lutX = Math.floor(r / 255 * (lutSize - 1));
+        const lutY = Math.floor(g / 255 * (lutSize - 1));
+        const lutZ = Math.floor(b / 255 * (lutSize - 1));
+
+        const lutIndex = ((lutZ * lutSize + lutY) * lutSize + lutX) * 4;
+
+        pixels[i] = lutData[lutIndex];
+        pixels[i + 1] = lutData[lutIndex + 1];
+        pixels[i + 2] = lutData[lutIndex + 2];
+    }
+
+    outputContext.putImageData(imageData, 0, 0);
+}
+
+function outputLUTAsJSCode(lutData, lutWidth, lutHeight, lutSize) {
+    const lutCodeElement = document.getElementById('lut-code');
+    let lutCode = 'const lut = [\n';
+
+    for (let z = 0; z < lutSize; z++) {
+        lutCode += '  [\n';
+        for (let y = 0; y < lutSize; y++) {
+            lutCode += '    [\n';
+            for (let x = 0; x < lutSize; x++) {
+                const index = ((z * lutSize + y) * lutSize + x) * 4;
+                lutCode += `      { r: ${lutData[index]}, g: ${lutData[index + 1]}, b: ${lutData[index + 2]} },\n`;
+            }
+            lutCode += '    ],\n';
+        }
+        lutCode += '  ],\n';
+    }
+
+    lutCode += '];\n';
+    lutCodeElement.textContent = lutCode;
+}
-- 
cgit 1.4.1-2-gfad0