rernanded
Erfahrenes Mitglied
Hallo,
habe dieses Script doch das gewünschte Zooming an der jeweils im Bild angeklickten Stelle in den Grössenstufen im Radius von 10px, 20px, 30px funktioniert nicht.
MONI
habe dieses Script doch das gewünschte Zooming an der jeweils im Bild angeklickten Stelle in den Grössenstufen im Radius von 10px, 20px, 30px funktioniert nicht.
MONI
HTML:
<!DOCTYPE html>
<html>
<head>
<title>Interactive Pixel Zoom</title>
<style>
.container {
display: flex;
gap: 20px;
padding: 20px;
}
#mainCanvas {
border: 1px solid #ccc;
cursor: pointer;
position: relative;
}
.controls {
margin-bottom: 10px;
}
button {
margin-right: 10px;
padding: 5px 10px;
}
.zoom-overlay {
position: absolute;
pointer-events: none;
box-shadow: 0 0 10px rgba(255,0,0,0.5);
}
</style>
</head>
<body>
<div class="container">
<div>
<input type="file" id="imageUpload" accept="image/*">
<div class="controls">
<button onclick="zoomIn()">Zoom In</button>
<button onclick="zoomOut()">Zoom Out</button>
<span id="currentZoom">Current Zoom: 1x</span>
</div>
<canvas id="mainCanvas"></canvas>
</div>
</div>
<script>
const mainCanvas = document.getElementById('mainCanvas');
const mainCtx = mainCanvas.getContext('2d');
let currentImage = null;
let zoomLevel = 1;
let lastClickX = 0;
let lastClickY = 0;
document.getElementById('imageUpload').addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
const img = new Image();
img.onload = function() {
currentImage = img;
mainCanvas.width = img.width;
mainCanvas.height = img.height;
drawImage();
};
img.src = event.target.result;
};
reader.readAsDataURL(file);
});
function drawImage() {
mainCtx.clearRect(0, 0, mainCanvas.width, mainCanvas.height);
if (currentImage) {
mainCtx.drawImage(currentImage, 0, 0);
}
}
mainCanvas.addEventListener('click', function(event) {
const rect = mainCanvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
console.log(`Clicked at (${x}, ${y})`);
lastClickX = x;
lastClickY = y;
drawImage();
drawZoomedSection(x, y);
});
function drawZoomedSection(x, y) {
const size = 10 * zoomLevel;
const radius = size / 2;
// Calculate source circle area
const srcX = Math.max(0, Math.min(x - radius, currentImage.width - size));
const srcY = Math.max(0, Math.min(y - radius, currentImage.height - size));
// Draw circular overlay
mainCtx.save();
mainCtx.beginPath();
mainCtx.arc(srcX + radius, srcY + radius, radius, 0, Math.PI * 2);
mainCtx.strokeStyle = 'red';
mainCtx.lineWidth = 2;
mainCtx.stroke();
// Draw zoomed area
mainCtx.globalCompositeOperation = 'destination-over';
mainCtx.beginPath();
mainCtx.arc(x, y, radius * zoomLevel, 0, Math.PI * 2);
mainCtx.clip();
// Draw zoomed section
mainCtx.drawImage(
currentImage,
srcX, srcY, size, size,
x - radius * zoomLevel, y - radius * zoomLevel,
size * zoomLevel, size * zoomLevel
);
mainCtx.restore();
}
function zoomIn() {
if (zoomLevel < 3) {
zoomLevel++;
document.getElementById('currentZoom').textContent =
`Current Zoom: ${zoomLevel * 10}px`;
if (lastClickX && lastClickY) {
drawImage();
drawZoomedSection(lastClickX, lastClickY);
}
}
}
function zoomOut() {
if (zoomLevel > 1) {
zoomLevel--;
document.getElementById('currentZoom').textContent =
`Current Zoom: ${zoomLevel * 10}px`;
if (lastClickX && lastClickY) {
drawImage();
drawZoomedSection(lastClickX, lastClickY);
}
}
}
</script>
</body>
</html>