1
0
Fork 0
generalized-lut/assets/js/functions.js

205 lines
7.5 KiB
JavaScript

function initPage(){
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var surface = new Image();
var source = new Image();
var shadow = new Image();
var spec = new Image();
var result = context.getImageData(0, 0, canvas.width, canvas.height);
surface.onload = function() {
source.onload = function() {
shadow.onload = function() {
spec.onload = function() {
makeImage(context, surface, source, shadow, spec);
}
spec.src = 'specular0000.jpg';
}
shadow.src = 'shadows0000.jpg';
}
source.src = 'source1.png';
};
surface.src = 'surface0000.png';
var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);
function handleImage(e){
var reader = new FileReader();
reader.onload = function(event){
var img = new Image();
img.onload = function(){
makeImage(context, surface, img, shadow, spec);
}
img.src = event.target.result;
}
reader.readAsDataURL(e.target.files[0]);
}
function drawImageScaled(img, context, keepaspect) {
var canvas = context.canvas;
context.clearRect(0, 0, canvas.width, canvas.height);
context.fillStyle = "#ffffff";
context.fillRect(0, 0, canvas.width, canvas.height);
if (keepaspect) {
var hRatio = canvas.width / img.width;
var vRatio = canvas.height / img.height;
var ratio = Math.min(hRatio, vRatio);
var centerShift_x = (canvas.width - img.width*ratio) / 2;
var centerShift_y = (canvas.height - img.height*ratio) / 2;
context.drawImage(img, 0, 0, img.width, img.height, centerShift_x, centerShift_y, img.width*ratio, img.height*ratio);
} else {
context.drawImage(img, 0, 0, canvas.width, canvas.height);
}
}
function applyColorGrading(context, colorLUTObj) {
var canvas = context.canvas;
var lut = {};
lut.width = 4096;
lut.height = 4096;
var img = context.getImageData(0, 0, canvas.width, canvas.height);
var imgdata = img.data;
canvas.width = lut.width;
canvas.height = lut.height;
drawImageScaled(colorLUTObj, context);
var color = context.getImageData(0, 0, canvas.width, canvas.height);
var colordata = color.data;
canvas.width = img.width;
canvas.height = img.height;
for(var i = 0; i < imgdata.length; i += 4) {
var pixelcoords = pixelcoordsFromLUT(imgdata[i], imgdata[i+1], imgdata[i+2], lut.width);
var pixelpos = (pixelcoords.x+(pixelcoords.y*lut.width))*4;
imgdata[i] = colordata[pixelpos];
imgdata[i+1] = colordata[pixelpos+1];
imgdata[i+2] = colordata[pixelpos+2];
}
context.putImageData(img, 0, 0);
}
function pixelcoordsFromLUT(r, g, b, lutsize) {
var square = {};
square.width = square.height = lutsize/16;
var pixelpos = {};
pixelpos.x = ((r/256)*square.width)+((b*square.width)%lutsize);
pixelpos.y = (255-((g/256))*square.height)+(Math.floor(b/(lutsize/square.height))*square.height);
return pixelpos;
}
function makeImage(context, surfaceObj, imageObj, shadowObj, specObj) {
var canvas = context.canvas;
var lut = {};
lut.width = 4096;
lut.height = 4096;
canvas.width = shadowObj.width;
canvas.height = shadowObj.height;
context.drawImage(shadowObj, 0, 0);
var shadow = context.getImageData(0, 0, canvas.width, canvas.height);
var shadowdata = shadow.data;
canvas.width = specObj.width;
canvas.height = specObj.height;
context.drawImage(specObj, 0, 0);
var specular = context.getImageData(0, 0, canvas.width, canvas.height);
var speculardata = specular.data;
canvas.width = lut.width;
canvas.height = lut.height;
drawImageScaled(imageObj, context);
var image = context.getImageData(0, 0, canvas.width, canvas.height);
var imagedata = image.data;
canvas.width = surfaceObj.width;
canvas.height = surfaceObj.height;
drawImageScaled(surfaceObj, context);
var surface = context.getImageData(0, 0, canvas.width, canvas.height);
var surfacedata = surface.data;
result = context.getImageData(0, 0, canvas.width, canvas.height);
var resultdata = result.data;
for(var i = 0; i < surfacedata.length; i += 4) {
resultdata[i] = 255;
resultdata[i+1] = 255;
resultdata[i+2] = 255;
if (surfacedata[i]+surfacedata[i+1]+surfacedata[i+2] > 0 && surfacedata[i]+surfacedata[i+1]+surfacedata[i+2]<(3*255)) {
var pixelcoords = pixelcoordsFromLUT(surfacedata[i], surfacedata[i+1], surfacedata[i+2], lut.width);
var pixelpos = (pixelcoords.x+(pixelcoords.y*lut.width))*4;
resultdata[i] = imagedata[pixelpos];
resultdata[i+1] = imagedata[pixelpos+1];
resultdata[i+2] = imagedata[pixelpos+2];
}
resultdata[i] -= 255-shadowdata[i];
resultdata[i+1] -= 255-shadowdata[i+1];
resultdata[i+2] -= 255-shadowdata[i+2];
resultdata[i] += speculardata[i];
resultdata[i+1] += speculardata[i+1];
resultdata[i+2] += speculardata[i+2];
var imagenoise = Math.round(Math.random()*5);
resultdata[i] += imagenoise;
resultdata[i+1] += imagenoise;
resultdata[i+2] += imagenoise;
}
context.putImageData(result, 0, 0);
$('#result, #result2, #result3, #result4').attr('src', canvas.toDataURL());
}
$('img').wrap('<span class="imglabel"></span>');
$('.imglabel').each(function() {
$(this).append('<span>'+$(this).find('img').attr('id')+'</span>');
});
$('.textureselect').click(function(e) {
e.preventDefault();
$('.textureselect').removeClass('active');
$(this).addClass('active');
var img = new Image();
img.onload = function(){
makeImage(context, surface, img, shadow, spec);
}
img.src = $(this).attr('href');
});
$('.calcgrading').click(function(e) {
e.preventDefault();
var color = new Image();
var color2 = new Image();
var color3 = new Image();
color.onload = function() {
context.putImageData(result, 0, 0);
applyColorGrading(context, color);
$('#result2').attr('src', canvas.toDataURL());
}
color.src = 'colors0000.png';
color2.onload = function() {
context.putImageData(result, 0, 0);
applyColorGrading(context, color2);
$('#result3').attr('src', canvas.toDataURL());
}
color2.src = 'colors0001.png';
color3.onload = function() {
context.putImageData(result, 0, 0);
applyColorGrading(context, color3);
$('#result4').attr('src', canvas.toDataURL());
}
color3.src = 'colors0002.png';
});
};