Download filter.js from ssboost/swq2f: direct link, hf CLI and curl.
- Browser
- Download file 4.7 kB
-
https://huggingface.co/spaces/ssboost/swq2f/resolve/main/filter.js
- Command line
-
hf download hf://spaces/ssboost/swq2f/filter.js
-
curl -L -o filter.js https://huggingface.co/spaces/ssboost/swq2f/resolve/main/filter.js
4.7 kB
| /** | |
| * ์ด๋ฏธ์ง ํํฐ ๊ธฐ๋ฅ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ | |
| * ์ด๋ฏธ์ง ํํฐ ์ ์ฉ, ๊ด๋ฆฌ์ ๊ด๋ จ๋ ๋ชจ๋ ํจ์๋ฅผ ํฌํจ | |
| */ | |
| // ํํฐ ๊ธฐ๋ณธ๊ฐ | |
| const DEFAULT_FILTERS = { | |
| temperature: 0, | |
| brightness: 100, | |
| contrast: 100, | |
| saturation: 100 | |
| }; | |
| /** | |
| * ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ํํฐ ์ ์ฉ | |
| * @param {ImageData} imageData - ์ด๋ฏธ์ง ๋ฐ์ดํฐ | |
| * @param {Object} filters - ํํฐ ์ค์ (temperature, brightness, contrast, saturation) | |
| * @returns {ImageData} - ํํฐ๊ฐ ์ ์ฉ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ | |
| */ | |
| function applyFilters(imageData, filters) { | |
| const {temperature, brightness, contrast, saturation} = filters; | |
| const data = imageData.data; | |
| // ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๊ฐ ํฝ์ ์ ํํฐ ์ ์ฉ | |
| for (let i = 0; i < data.length; i += 4) { | |
| // RGB ๊ฐ ์ถ์ถ | |
| let r = data[i]; | |
| let g = data[i + 1]; | |
| let b = data[i + 2]; | |
| // ์์จ๋ ์ ์ฉ (๋นจ๊ฐ์/ํ๋์ ์กฐ์ ) | |
| if (temperature !== 0) { | |
| const tempValue = temperature / 5; // ํจ๊ณผ ๊ฐ๋ ์กฐ์ | |
| if (tempValue > 0) { | |
| // ๋ฐ๋ปํ ์์กฐ (๋ ๋นจ๊ฐ๊ฒ) | |
| r = Math.min(255, r + tempValue); | |
| b = Math.max(0, b - tempValue / 2); | |
| } else { | |
| // ์ฐจ๊ฐ์ด ์์กฐ (๋ ํ๋๊ฒ) | |
| r = Math.max(0, r + tempValue); | |
| b = Math.min(255, b - tempValue * 1.5); | |
| } | |
| } | |
| // ๋ฐ๊ธฐ ์ ์ฉ (๋ชจ๋ ์์ ์ฑ๋์ ๊ท ์ผํ๊ฒ ์ ์ฉ) | |
| const brightnessMultiplier = brightness / 100; | |
| r = Math.min(255, r * brightnessMultiplier); | |
| g = Math.min(255, g * brightnessMultiplier); | |
| b = Math.min(255, b * brightnessMultiplier); | |
| // ๋๋น ์ ์ฉ | |
| const contrastFactor = (contrast / 100); | |
| r = Math.min(255, Math.max(0, (r - 128) * contrastFactor + 128)); | |
| g = Math.min(255, Math.max(0, (g - 128) * contrastFactor + 128)); | |
| b = Math.min(255, Math.max(0, (b - 128) * contrastFactor + 128)); | |
| // ์ฑ๋ ์ ์ฉ | |
| const avg = (r + g + b) / 3; | |
| const saturationMultiplier = saturation / 100; | |
| r = Math.min(255, Math.max(0, avg + (r - avg) * saturationMultiplier)); | |
| g = Math.min(255, Math.max(0, avg + (g - avg) * saturationMultiplier)); | |
| b = Math.min(255, Math.max(0, avg + (b - avg) * saturationMultiplier)); | |
| // ๊ฐ ๋ค์ ์ ์ฅ | |
| data[i] = Math.round(r); | |
| data[i + 1] = Math.round(g); | |
| data[i + 2] = Math.round(b); | |
| } | |
| return imageData; | |
| } | |
| /** | |
| * ์ด๋ฏธ์ง์ ํํฐ๋ฅผ ์ ์ฉํ์ฌ ์ ์บ๋ฒ์ค์ ๊ทธ๋ฆฌ๊ธฐ | |
| * @param {HTMLImageElement} image - ์๋ณธ ์ด๋ฏธ์ง | |
| * @param {Object} filters - ํํฐ ์ค์ | |
| * @returns {HTMLCanvasElement} - ํํฐ๊ฐ ์ ์ฉ๋ ์ด๋ฏธ์ง๊ฐ ๊ทธ๋ ค์ง ์บ๋ฒ์ค | |
| */ | |
| function createFilteredCanvas(image, filters) { | |
| if (!image) return null; | |
| const tempCanvas = document.createElement('canvas'); | |
| tempCanvas.width = image.width; | |
| tempCanvas.height = image.height; | |
| const tempCtx = tempCanvas.getContext('2d'); | |
| // ์๋ณธ ์ด๋ฏธ์ง ๊ทธ๋ฆฌ๊ธฐ | |
| tempCtx.drawImage(image, 0, 0); | |
| // ํํฐ ์ ์ฉ | |
| const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height); | |
| const filteredData = applyFilters(imageData, filters); | |
| tempCtx.putImageData(filteredData, 0, 0); | |
| return tempCanvas; | |
| } | |
| /** | |
| * ์ ํ๋ ๋ ์ด์ด์๋ง ํํฐ ์ ์ฉ | |
| * @param {Array} overlays - ๋ ์ด์ด ๋ฐฐ์ด | |
| * @param {number} activeOverlayIndex - ํ์ฌ ํ์ฑ ๋ ์ด์ด ์ธ๋ฑ์ค | |
| * @param {Object} filterValues - ์ ์ฉํ ํํฐ ๊ฐ | |
| */ | |
| function applyFilterToLayer(overlays, activeOverlayIndex, filterValues) { | |
| if (activeOverlayIndex >= 0 && activeOverlayIndex < overlays.length) { | |
| // ํ์ฌ ์ ํ๋ ๋ ์ด์ด์๋ง ํํฐ ์ ์ฉ | |
| overlays[activeOverlayIndex].filters = { ...filterValues }; | |
| } | |
| } | |
| /** | |
| * ํํฐ ์ด๊ธฐํ | |
| * @param {Array} overlays - ๋ ์ด์ด ๋ฐฐ์ด | |
| * @param {number} activeOverlayIndex - ํ์ฌ ํ์ฑ ๋ ์ด์ด ์ธ๋ฑ์ค | |
| * @returns {Object} - ์ด๊ธฐํ๋ ํํฐ ๊ฐ | |
| */ | |
| function resetFilters(overlays, activeOverlayIndex) { | |
| // ํ์ฌ ๋ ์ด์ด์ ํํฐ๋ฅผ ์ด๊ธฐํ | |
| if (activeOverlayIndex >= 0 && activeOverlayIndex < overlays.length) { | |
| overlays[activeOverlayIndex].filters = { ...DEFAULT_FILTERS }; | |
| } | |
| // ์ด๊ธฐ ํํฐ ๊ฐ ๋ฐํ | |
| return { ...DEFAULT_FILTERS }; | |
| } | |
| // filter.js์ ํจ์๋ฅผ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ญ์ผ๋ก ๋ ธ์ถ | |
| window.ImageFilters = { | |
| applyFilters, | |
| createFilteredCanvas, | |
| applyFilterToLayer, | |
| resetFilters, | |
| DEFAULT_FILTERS | |
| }; |