iFSR-Sharepicgenerator/js/script.js

215 lines
7.2 KiB
JavaScript
Raw Normal View History

2025-02-01 13:10:04 +01:00
// Variablen für hochgeladene Bilder und deren Position
let uploadedImage = null;
let uploadedLogo = null;
let imageOffsetX = 0;
let imageOffsetY = 0;
let isDragging = false;
let dragStartX = 0;
let dragStartY = 0;
// Standardwerte für Bild, Logo und Texte
const defaultImage = 'assets/images/defaultBackground.jpg';
const defaultLogo = 'assets/images/defaultLogo.svg';
const defaultHeadline = 'iFSR sharepic Headline';
const defaultSubline = 'Hier könnte ein unfassbar fesselnder Werbetext des Fachschaftsrats Informatik stehen.';
// Initialisierung beim Laden der Seite
window.onload = function () {
document.getElementById('headline').value = defaultHeadline;
document.getElementById('subline').value = defaultSubline;
loadDefaultImage();
loadDefaultLogo();
generateSharepic();
};
// Lädt das Standardhintergrundbild
function loadDefaultImage() {
uploadedImage = new Image();
uploadedImage.onload = drawCanvas;
uploadedImage.src = defaultImage;
}
// Lädt das Standardlogo
function loadDefaultLogo() {
uploadedLogo = new Image();
uploadedLogo.onload = drawCanvas;
uploadedLogo.src = defaultLogo;
}
// Event-Listener für Datei-Uploads und Eingaben
document.getElementById('imageUpload').addEventListener('change', handleImageUpload);
document.getElementById('logoUpload').addEventListener('change', handleLogoUpload);
document.getElementById('headline').addEventListener('input', generateSharepic);
document.getElementById('subline').addEventListener('input', generateSharepic);
document.getElementById('fontSize').addEventListener('input', generateSharepic);
document.getElementById('boxHeight').addEventListener('input', generateSharepic);
document.getElementById('logoSize').addEventListener('input', generateSharepic);
document.getElementById('logoLeft').addEventListener('change', generateSharepic);
// Verarbeitet den Upload eines neuen Hintergrundbildes
function handleImageUpload(event) {
const file = event.target.files[0];
if (file) {
const imageUrl = URL.createObjectURL(file);
uploadedImage = new Image();
uploadedImage.onload = function () {
imageOffsetX = 0;
imageOffsetY = 0;
drawCanvas();
};
uploadedImage.src = imageUrl;
}
}
// Verarbeitet den Upload eines neuen Logos
function handleLogoUpload(event) {
const file = event.target.files[0];
if (file) {
const logoUrl = URL.createObjectURL(file);
uploadedLogo = new Image();
uploadedLogo.onload = drawCanvas;
uploadedLogo.src = logoUrl;
}
}
// Generiert das Sharepic neu
function generateSharepic() {
drawCanvas();
}
// Berechnet die Bildgröße passend zur Canvas-Größe
function calculateImageDimensions(image, canvas) {
let imageWidth, imageHeight;
if (image.width > image.height) {
imageHeight = canvas.height;
imageWidth = image.width * (imageHeight / image.height);
} else {
imageWidth = canvas.width;
imageHeight = image.height * (imageWidth / image.width);
}
return { width: imageWidth, height: imageHeight };
}
// Zeichnet das Canvas mit Bild, Logo und Text
function drawCanvas() {
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
canvas.width = 1080;
canvas.height = 1080;
// Zeichnet das hochgeladene Hintergrundbild
if (uploadedImage) {
const { width, height } = calculateImageDimensions(uploadedImage, canvas);
ctx.drawImage(uploadedImage, imageOffsetX, imageOffsetY, width, height);
}
// Zeichnet das weiße Textfeld
const boxHeight = parseInt(document.getElementById('boxHeight').value);
const boxPadding = 20;
ctx.fillStyle = 'white';
ctx.fillRect(boxPadding, canvas.height - boxHeight - boxPadding, canvas.width - 2 * boxPadding, boxHeight);
// Holt die Texteingaben
const headline = document.getElementById('headline').value;
const subline = document.getElementById('subline').value;
const fontSize = parseInt(document.getElementById('fontSize').value);
// Setzt Schriftfarbe
ctx.fillStyle = 'black';
const headlineFont = `bold ${fontSize * 1.2}px 'Cairo', sans-serif`;
const sublineFont = `${fontSize}px 'Cairo', sans-serif`;
const maxWidth = canvas.width - 2 * boxPadding - 40;
// Funktion zum Umbruch langer Texte
function wrapText(ctx, text, x, y, maxWidth, font) {
ctx.font = font;
const lineHeight = parseInt(font.match(/\d+/)[0]) * 1.2;
const words = text.split(' ');
let line = '';
let lines = [];
for (let n = 0; n < words.length; n++) {
let testLine = line + words[n] + ' ';
let testWidth = ctx.measureText(testLine).width;
if (testWidth > maxWidth && n > 0) {
lines.push(line);
line = words[n] + ' ';
} else {
line = testLine;
}
}
lines.push(line);
lines.forEach((line, i) => ctx.fillText(line, x, y + i * lineHeight));
}
// Zeichnet Headline und Subline ins Canvas
wrapText(ctx, headline, boxPadding + 20, canvas.height - boxHeight - boxPadding + 80, maxWidth, headlineFont);
wrapText(ctx, subline, boxPadding + 20, canvas.height - boxHeight - boxPadding + 150, maxWidth, sublineFont);
// Zeichnet das Logo
if (uploadedLogo) {
const logoSize = parseInt(document.getElementById('logoSize').value);
const logoRatio = uploadedLogo.width / uploadedLogo.height;
let logoWidth = logoSize * logoRatio;
let logoHeight = logoSize;
if (logoWidth > canvas.width - 40) {
logoWidth = canvas.width - 40;
logoHeight = logoWidth / logoRatio;
}
const logoLeft = document.getElementById('logoLeft').checked;
const logoX = logoLeft ? 20 : canvas.width - logoWidth - 20;
ctx.drawImage(uploadedLogo, logoX, 20, logoWidth, logoHeight);
}
}
// Bild-Drag-Funktionalität
const canvas = document.getElementById('canvas');
canvas.addEventListener('mousedown', function (e) {
if (uploadedImage) {
isDragging = true;
dragStartX = e.offsetX - imageOffsetX;
dragStartY = e.offsetY - imageOffsetY;
}
});
canvas.addEventListener('mousemove', function (e) {
if (isDragging && uploadedImage) {
const { width, height } = calculateImageDimensions(uploadedImage, canvas);
if (uploadedImage.width > uploadedImage.height) {
imageOffsetX = e.offsetX - dragStartX;
imageOffsetX = Math.min(0, Math.max(imageOffsetX, canvas.width - width));
} else {
imageOffsetY = e.offsetY - dragStartY;
imageOffsetY = Math.min(0, Math.max(imageOffsetY, canvas.height - height));
}
drawCanvas();
}
});
canvas.addEventListener('mouseup', () => isDragging = false);
canvas.addEventListener('mouseout', () => isDragging = false);
// Download-Button für das Sharepic
document.getElementById('downloadBtn').addEventListener('click', function (event) {
event.preventDefault();
const dataUrl = canvas.toDataURL('image/png');
const a = document.createElement('a');
a.href = dataUrl;
a.download = 'sharepic.png';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
});