Calculating the correct amount of moulding (or molding) for a picture frame is critical to avoid running out of material during a project. Unlike simple linear measurements, picture framing requires additional length to account for the mitered corners and saw blade waste.
The Formula Explained
When you build a frame, the outside perimeter is significantly longer than the inside perimeter (the artwork size). The standard formula used by professional framers is:
Why 8 times the moulding width? Because a standard frame has four 90-degree corners, usually cut at 45-degree angles. At each corner, the outside edge of the frame extends past the inside edge by exactly two times the width of the moulding. Since there are four corners, we add 8 times the moulding width to the total length.
Understanding Waste Allowance
You should never order the exact mathematical length required. Professional framers always add a "Waste Factor" or "Chop Allowance" for several reasons:
Saw Kerf: The saw blade removes material (about 1/8 inch) with every cut.
Knots and Defects: Wood moulding often has imperfections that must be cut out.
Miter Errors: If a cut isn't perfect, you may need to recut the end, shortening the stick.
We recommend a waste allowance of 10% to 20% for standard projects. If you are a beginner or using a complex moulding pattern that requires pattern matching, consider adding 20-30%.
How to Measure
Measure Artwork: Measure the width and height of the mat board, glass, or artwork you are framing. This is your "Glass Size."
Determine Moulding Width: Measure the full width across the face of the moulding stick.
Input Dimensions: Enter these values into the calculator above to get the linear footage required.
Buying Tips
Moulding is typically sold by the foot or in 8-10 foot "sticks." When purchasing, always round up to the nearest whole foot or full stick length. It is far better to have a foot of leftover scrap than to be one inch short on your final side.
function calculateMoulding() {
// 1. Get DOM elements
var widthInput = document.getElementById("artworkWidth");
var heightInput = document.getElementById("artworkHeight");
var mouldingInput = document.getElementById("mouldingWidth");
var wasteInput = document.getElementById("wastePercent");
var costInput = document.getElementById("costPerFoot");
var resultsDiv = document.getElementById("results");
// 2. Parse values
var width = parseFloat(widthInput.value);
var height = parseFloat(heightInput.value);
var mouldingWidth = parseFloat(mouldingInput.value);
var wastePercent = parseFloat(wasteInput.value);
var costPerFoot = parseFloat(costInput.value);
// 3. Validation
if (isNaN(width) || isNaN(height) || isNaN(mouldingWidth)) {
alert("Please enter valid numbers for Artwork Width, Height, and Moulding Width.");
return;
}
if (isNaN(wastePercent)) {
wastePercent = 0;
}
// 4. Calculation Logic
// Inside Perimeter (Glass Size)
var insidePerimeter = (2 * width) + (2 * height);
// Miter Allowance: 8 x Moulding Width
// This accounts for the 4 corners where the outer edge is longer than the inner edge
var miterAllowance = 8 * mouldingWidth;
// Net Length (Mathematical Minimum)
var netLength = insidePerimeter + miterAllowance;
// Waste Factor
var wasteAmount = netLength * (wastePercent / 100);
// Total Length needed
var totalLengthInches = netLength + wasteAmount;
var totalLengthFeet = totalLengthInches / 12;
// Outer Dimensions
var outerWidth = width + (2 * mouldingWidth);
var outerHeight = height + (2 * mouldingWidth);
// 5. Update UI
document.getElementById("basePerimeter").innerText = insidePerimeter.toFixed(2) + '"';
document.getElementById("miterAllowance").innerText = miterAllowance.toFixed(2) + '"';
document.getElementById("netLength").innerText = netLength.toFixed(2) + '"';
document.getElementById("totalLengthInches").innerText = totalLengthInches.toFixed(2) + '"';
document.getElementById("totalLengthFeet").innerText = totalLengthFeet.toFixed(2) + ' ft';
document.getElementById("outerDims").innerText =
outerWidth.toFixed(2) + '" x ' + outerHeight.toFixed(2) + '"';
// Cost Calculation
var costRow = document.getElementById("costRow");
if (!isNaN(costPerFoot) && costPerFoot > 0) {
var totalCost = totalLengthFeet * costPerFoot;
document.getElementById("totalCost").innerText = "$" + totalCost.toFixed(2);
costRow.style.display = "flex";
} else {
costRow.style.display = "none";
}
// Show results section
resultsDiv.style.display = "block";
// Scroll to results for better UX on mobile
resultsDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}