When building a custom picture frame, the amount of moulding required is significantly longer than the perimeter of the artwork. This is due to the 45-degree miter cuts where the outer edge of the wood must travel further than the inner edge.
The Math Behind the Cuts:
Allowance: We typically add 1/8″ to the artwork dimensions to ensure the glass and backing fit into the rabbet without being too tight.
Miter Calculation: Each corner requires an additional length equal to the width of the moulding face. Since each rail has two corners, you add twice the moulding width to each dimension.
Add 15-20% for saw kerfs, knots, or grain matching.
Pro Tips for Frame Builders
Always measure the "rabbet" (the groove where the art sits) rather than just the total wood thickness. If you are using wide moulding, the difference between the inner perimeter and outer perimeter can be massive. For a 3-inch wide moulding on a 10×10 frame, you actually need 64 inches of material, not 40!
function calculateFrame() {
var artW = parseFloat(document.getElementById('artWidth').value);
var artH = parseFloat(document.getElementById('artHeight').value);
var mWidth = parseFloat(document.getElementById('mouldingWidth').value);
var allowance = parseFloat(document.getElementById('allowance').value);
var waste = parseFloat(document.getElementById('wasteFactor').value);
var costPerFoot = parseFloat(document.getElementById('unitCost').value);
if (isNaN(artW) || isNaN(artH) || isNaN(mWidth)) {
alert("Please enter valid dimensions for Width, Height, and Moulding Width.");
return;
}
// Calculation for one side: Art + (2 * Allowance) + (2 * Moulding Width)
// Note: Standard framing logic uses Art + Allowance as the "Inner" dimension.
var railA = artW + (allowance * 2) + (mWidth * 2);
var railB = artH + (allowance * 2) + (mWidth * 2);
var netInches = (railA * 2) + (railB * 2);
var totalInches = netInches * (1 + (waste / 100));
var totalFeet = totalInches / 12;
// Displaying results
document.getElementById('frameResults').style.display = 'block';
document.getElementById('externalDims').innerHTML = railA.toFixed(3) + '" x ' + railB.toFixed(3) + '"';
document.getElementById('cutList').innerHTML = railA.toFixed(3) + '" and ' + railB.toFixed(3) + '"';
document.getElementById('netLength').innerHTML = netInches.toFixed(2) + ' inches (' + (netInches / 12).toFixed(2) + ' ft)';
document.getElementById('totalLength').innerHTML = totalInches.toFixed(2) + ' inches (' + totalFeet.toFixed(2) + ' ft)';
if (!isNaN(costPerFoot) && costPerFoot > 0) {
var totalCost = totalFeet * costPerFoot;
document.getElementById('costRow').style.display = 'flex';
document.getElementById('totalCost').innerHTML = '$' + totalCost.toFixed(2);
} else {
document.getElementById('costRow').style.display = 'none';
}
}