You can edit the below JavaScript code to customize the image tool.
function processImage(originalImg) {
const canvas = document.createElement('canvas');
// Ensure the originalImg is a loaded image with valid dimensions
if (!originalImg || typeof originalImg.width === 'undefined' || originalImg.width === 0 || typeof originalImg.height === 'undefined' || originalImg.height === 0) {
console.error("Provided originalImg is not valid or not loaded.");
// Return an empty canvas or handle as an error appropriately
canvas.width = 1; // Minimal canvas
canvas.height = 1;
return canvas;
}
canvas.width = originalImg.width;
canvas.height = originalImg.height;
const ctx = canvas.getContext('2d', { willReadFrequently: true });
if (!ctx) {
console.error("Could not get 2D rendering context.");
// Fallback: return the canvas, which might be empty or not properly initialized
return canvas;
}
try {
ctx.drawImage(originalImg, 0, 0, canvas.width, canvas.height);
} catch (e) {
console.error("Error drawing image to canvas: ", e);
// Return canvas, possibly empty or with partial draw if error occurred
return canvas;
}
let imageData;
try {
imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
} catch (e) {
console.error("Error getting ImageData (e.g., canvas tainted from cross-origin image): ", e);
// If canvas is tainted, pixel manipulation is not possible.
// Return the canvas with the original image drawn.
return canvas;
}
const data = imageData.data;
// Kodak Ektar 100 Film Effect Parameters. These values are tuned to approximate
// the known characteristics of Ektar 100 film (high saturation, fine grain,
// punchy reds/blues, good contrast, slight warmth).
const CONTRAST_FACTOR = 1.15; // Increases contrast for a "punchier" image.
const SATURATION_FACTOR = 1.30; // Ektar is known for its vivid, saturated colors.
// Channel-specific multipliers to adjust the color palette.
const RED_CHANNEL_MULTIPLIER = 1.10; // Enhances reds, making them more vibrant.
const GREEN_CHANNEL_MULTIPLIER = 0.97;// Slightly subdues or shifts greens. Ektar greens are often described as natural but not overly dominant.
const BLUE_CHANNEL_MULTIPLIER = 1.08; // Deepens and enriches blues.
// Additive warmth to introduce a subtle warm color cast.
const WARMTH_ADD_R = 6; // Adds warmth via the red channel.
const WARMTH_ADD_G = 3; // Adds a smaller amount of warmth via the green channel.
// Blue channel is not warmed to maintain clarity of cool tones.
// Standard luminance coefficients for saturation calculation.
const R_LUM_COEFF = 0.299;
const G_LUM_COEFF = 0.587;
const B_LUM_COEFF = 0.114;
for (let i = 0; i < data.length; i += 4) {
let r = data[i];
let g = data[i+1];
let b = data[i+2];
// 1. Apply Contrast
// Pixel values are normalized to [0,1], adjusted around the 0.5 midpoint, then scaled back.
r = (r / 255.0 - 0.5) * CONTRAST_FACTOR + 0.5;
g = (g / 255.0 - 0.5) * CONTRAST_FACTOR + 0.5;
b = (b / 255.0 - 0.5) * CONTRAST_FACTOR + 0.5;
// Convert back to 0-255 range and clamp
r = Math.max(0, Math.min(1.0, r)) * 255.0;
g = Math.max(0, Math.min(1.0, g)) * 255.0;
b = Math.max(0, Math.min(1.0, b)) * 255.0;
// 2. Apply Saturation
// Calculates luminance, then adjusts color components away from or towards this gray value.
const lum = R_LUM_COEFF * r + G_LUM_COEFF * g + B_LUM_COEFF * b;
r = lum + SATURATION_FACTOR * (r - lum);
g = lum + SATURATION_FACTOR * (g - lum);
b = lum + SATURATION_FACTOR * (b - lum);
// Clamp values after saturation
r = Math.max(0, Math.min(255.0, r));
g = Math.max(0, Math.min(255.0, g));
b = Math.max(0, Math.min(255.0, b));
// 3. Apply Ektar Color Signature (Channel Multipliers and Warmth)
r *= RED_CHANNEL_MULTIPLIER;
g *= GREEN_CHANNEL_MULTIPLIER;
b *= BLUE_CHANNEL_MULTIPLIER;
// Add warmth
r += WARMTH_ADD_R;
g += WARMTH_ADD_G;
// b is intentionally not increased by WARMTH_ADD to preserve cool blue tones.
// Final clamp and assignment
// Values are rounded to the nearest integer for pixel data.
data[i] = Math.max(0, Math.min(255, Math.round(r)));
data[i+1] = Math.max(0, Math.min(255, Math.round(g)));
data[i+2] = Math.max(0, Math.min(255, Math.round(b)));
// Alpha channel (data[i+3]) is preserved.
}
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!
The Image Kodak Ektar 100 Film Filter Effect tool allows users to apply a filter that mimics the vibrant and saturated color profile characteristic of Kodak Ektar 100 film. This tool enhances the contrast, clarity, and warmth of images, making it ideal for photographers and graphic designers looking to achieve a classic film-like aesthetic in their digital photos. It is particularly useful for enhancing landscape photography, portraits, and any imagery where rich colors and deep contrasts are desired.