') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - naazeri/Image-Compressor · GitHub
Skip to content

Repository files navigation

Image Compressor

This repository contains a simple yet powerful image compressor built using ASP.NET Core. The goal of this project is to provide an easy way to upload and optimize images by reducing their file size while maintaining the image quality as much as possible.

Features

  • Image Upload: Allows users to upload images.
  • Image Compression: Compresses the uploaded images to reduce file size without significant quality loss.
  • ASP.NET Core: Built with ASP.NET Core MVC 8 for modern web application architecture.

Prerequisites

Before running the project, ensure you have the following installed:

  • .NET SDK (version 8 or later)
  • Any preferred IDE that supports ASP.NET Core projects (Visual Studio, VS Code, etc.)

How to Run

  1. Clone the repository:

    git clone https://github.com/naazeri/Image-Compressor.git
  2. Navigate to the project directory:

    cd Image-Compressor
  3. Restore the dependencies:

    dotnet restore
  4. Run the application:

    dotnet run

Usage

  • Navigate to the image upload section to upload an image.
  • The application will automatically compress the uploaded image.
  • You can find the compressed images after the process completes in wwwroot/images directory.

Contributions

Contributions, issues, and feature requests are welcome! Feel free to check the issues page.

License

This project is licensed under the MIT License.

Image Uploader with Optimization - ASP.NET Core MVC 8

This project is an ASP.NET Core MVC 8 application that allows users to upload multiple images (up to 100 images at once, with each image up to 50 MB). The images are uploaded to a server, optimized, and stored in a separate directory. Users are shown progress while the optimization is happening and are notified once the process is complete.

Features

  • Multiple Image Uploads: Upload up to 100 images in a single batch.
  • File Size Restriction: Each image file is restricted to a maximum size of 50 MB.
  • Image Optimization: Images are processed and optimized after upload. The optimized images are stored in a separate directory.
  • Loading Indication: Users are notified while the optimization process is taking place.
  • No Authentication: This project does not include any user authentication.

Requirements

  • .NET SDK 8.0
  • Visual Studio or any code editor with .NET Core support

Getting Started

1. Clone the Repository

git clone https://github.com/yourusername/ImageUploader.git
cd ImageUploader

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages