Please bookmark this page to avoid losing your image tool!

Image Large Format Film Filter Effect Creator

(Free & Supports Bulk Upload)

Drag & drop your images here or

The result will appear here...
You can edit the below JavaScript code to customize the image tool.
function processImage(originalImg, saturationAdjustment = 0.8, contrastAdjustment = 1.1, grainAmount = 0.05, vignetteStrength = 0.4, colorTint = "255,240,220", tintOpacity = 0.08) {
    const canvas = document.createElement('canvas');
    // Using { willReadFrequently: true } can be a performance hint for browsers when using getImageData/putImageData frequently.
    const ctx = canvas.getContext('2d', { willReadFrequently: true });

    // Ensure dimensions are from natural size of the image, not potentially styled size
    canvas.width = originalImg.naturalWidth || originalImg.width;
    canvas.height = originalImg.naturalHeight || originalImg.height;

    // Handle cases of 0-dimension images to prevent errors
    if (canvas.width === 0 || canvas.height === 0) {
        // Return the 0-dimension canvas. The caller can decide how to handle this.
        return canvas;
    }

    ctx.drawImage(originalImg, 0, 0, canvas.width, canvas.height);

    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const data = imageData.data;

    // Parse colorTint string "R,G,B" into individual numeric components
    const tintColorsStr = colorTint.split(',').map(s => s.trim());
    const parsedTintR = parseInt(tintColorsStr[0], 10);
    const parsedTintG = parseInt(tintColorsStr[1], 10);
    const parsedTintB = parseInt(tintColorsStr[2], 10);

    // Use default tint values if parsing fails (e.g., malformed string, missing components)
    const finalTintR = isNaN(parsedTintR) ? 255 : parsedTintR;
    const finalTintG = isNaN(parsedTintG) ? 240 : parsedTintG;
    const finalTintB = isNaN(parsedTintB) ? 220 : parsedTintB;
    
    const centerX = canvas.width / 2;
    const centerY = canvas.height / 2;
    // Max distance from center to a corner, used for vignette normalization.
    // This ensures the vignette effect reaches the corners properly.
    const maxDistVignette = Math.sqrt(centerX * centerX + centerY * centerY); 

    for (let i = 0; i < data.length; i += 4) {
        let r = data[i];
        let g = data[i + 1];
        let b = data[i + 2];

        // 1. Saturation Adjustment
        // Skip if saturationAdjustment is 1.0 (no change)
        if (saturationAdjustment !== 1.0) {
            const lum = 0.299 * r + 0.587 * g + 0.114 * b; // Calculate luminance
            r = lum + saturationAdjustment * (r - lum);
            g = lum + saturationAdjustment * (g - lum);
            b = lum + saturationAdjustment * (b - lum);
        }

        // 2. Contrast Adjustment
        // Skip if contrastAdjustment is 1.0 (no change)
        if (contrastAdjustment !== 1.0) {
            r = ((r / 255 - 0.5) * contrastAdjustment + 0.5) * 255;
            g = ((g / 255 - 0.5) * contrastAdjustment + 0.5) * 255;
            b = ((b / 255 - 0.5) * contrastAdjustment + 0.5) * 255;
        }
        
        // Clamp intermediate results to [0, 255] range before applying additive effects
        r = Math.max(0, Math.min(255, r));
        g = Math.max(0, Math.min(255, g));
        b = Math.max(0, Math.min(255, b));

        // 3. Color Tint
        if (tintOpacity > 0) {
            r = r * (1 - tintOpacity) + finalTintR * tintOpacity;
            g = g * (1 - tintOpacity) + finalTintG * tintOpacity;
            b = b * (1 - tintOpacity) + finalTintB * tintOpacity;
        }

        // 4. Grain
        if (grainAmount > 0) {
            // Generate monochrome noise for a classic film grain look
            // Noise is centered around 0, scaled by grainAmount and color range.
            const noise = (Math.random() - 0.5) * 255 * grainAmount;
            r += noise;
            g += noise;
            b += noise;
        }
        
        // Clamp again after tint and grain which are additive
        r = Math.max(0, Math.min(255, r));
        g = Math.max(0, Math.min(255, g));
        b = Math.max(0, Math.min(255, b));

        // 5. Vignette
        // Apply vignette if strength is positive and image has dimensions
        if (vignetteStrength > 0 && maxDistVignette > 0) {
            // Calculate current pixel's coordinates from its index
            const currentPixelX = (i / 4) % canvas.width;
            const currentPixelY = Math.floor((i / 4) / canvas.width);
            
            const dx = currentPixelX - centerX;
            const dy = currentPixelY - centerY;
            const dist = Math.sqrt(dx * dx + dy * dy);
            
            // Normalized distance from center (0 at center, 1 at corners)
            const percentDist = dist / maxDistVignette;
            
            // Vignette falloff power: 2.0 for quadratic (standard), higher for sharper falloff
            const vignettePower = 2.0; 
            // vignetteStrength (0-1) determines darkness at edges. 
            // 0 = no vignette, 1 = black edges.
            const vignetteMultiplier = 1.0 - (vignetteStrength * Math.pow(percentDist, vignettePower));
            
            // Apply vignette by multiplying color values. Clamp multiplier to be >= 0.
            r *= Math.max(0, vignetteMultiplier);
            g *= Math.max(0, vignetteMultiplier);
            b *= Math.max(0, vignetteMultiplier);
        }

        // Final assignment after all effects. Clamp values to ensure they are valid.
        data[i] = Math.max(0, Math.min(255, r));
        data[i + 1] = Math.max(0, Math.min(255, g));
        data[i + 2] = Math.max(0, Math.min(255, b));
        // Alpha channel (data[i+3]) remains unchanged
    }

    ctx.putImageData(imageData, 0, 0);
    return canvas;
}

Free Image Tool Creator

Can't find the image tool you're looking for?
Create one based on your own needs now!

Description

The Image Large Format Film Filter Effect Creator allows users to apply a variety of film-inspired effects to their images, simulating the aesthetic of large format photography. This tool enables adjustments including saturation, contrast, and grain levels, as well as a unique color tint and vignette effects. It can be used for enhancing photographs, creating artistic representations, and producing images that evoke a classic film look, making it ideal for photographers, graphic designers, and enthusiasts looking to add a vintage touch to their digital images.

Leave a Reply

Your email address will not be published. Required fields are marked *

Other Image Tools:

Image Pinhole Camera Filter Effect Tool

Image Warming Filter Effect Tool

Image Fujifilm Pro 400H Filter Effect Application

Image Diffusion Filter Effect Tool

Image Push-Processed Film Filter Effect Tool

Image Color Temperature Orange Filter Effect Tool

Image Kodak Ektar 100 Film Filter Effect

Image Yellow Filter Black And White Effect Tool

Image Expired Film Filter Effect Tool

Image Circular Polarizer Filter Effect Tool

Image Lomography Purple Filter Effect Tool

Image Split Field Filter Effect Tool

Image Soft Focus Filter Effect Tool

Image Medium Format Film Filter Effect

Image Wide-Angle Lens Perspective Filter Effect Tool

Olympus OM-1 Photo Filter Effect Tool

Image Fujifilm Velvia Filter Effect Tool

Image Lensbaby Selective Focus Filter Effect Tool

Image Color Temperature Blue Filter Effect Tool

Image UV Filter Effect Tool

Image Red Filter Black And White Effect Tool

Image Redscale Film Filter Effect

Image Cinestill 800T Filter Effect Tool

Image Glimmer Glass Filter Effect Tool

Image Star Filter Effect Tool

Image Kodak Portra 400 Film Filter Effect

Image Fujifilm Superia Filter Effect Tool

Image Tilt-Shift Lens Filter Effect Tool

Image Graduated Neutral Density Filter Effect Tool

Image Diana Camera Filter Effect Tool

Image 35mm Film Camera Filter Effect Tool

Image Pro-Mist Filter Effect Application

Image Cross-Processed Slide Film Filter Effect Application

Image Pull-Processed Film Filter Effect Tool

Image Infrared Filter Effect Application

Image Ilford Delta 3200 Filter Effect Application

See All →