Eine moderne, leistungsstarke Bildbearbeitungsanwendung, die vollständig im Browser läuft. Gebaut mit Vue 3, TypeScript, Pinia und Vite.
- 🖼️ Mehrere Bilder gleichzeitig bearbeiten
- 🔄 Transformationen (Drehen, Spiegeln, Umbennenen, Größe ändern)
- 📄 PDF-Export (einzeln oder als Sammlung)
- 🗜️ ZIP-Download
- 🎨 Multiple Export-Formate (PNG, JPEG, WebP)
- 🌓 Dark/Light Mode
- 🌍 Mehrsprachig (Deutsch/Englisch)
- 🔒 Vollständig im Browser, keine Server, alle Daten bleiben lokal
- ⚡ Schnell und performant
vue-image-editor/
├── src/
│ ├── lib/ # Wiederverwendbare Bibliotheken
│ │ ├── core/ # Kern-Funktionalität
│ │ │ ├── types.ts # TypeScript Typdefinitionen
│ │ │ └── image-processor.ts # Bildverarbeitungslogik
│ │ └── features/ # Feature-Module
│ │ ├── export-pdf.ts # PDF-Export
│ │ └── export-zip.ts # ZIP-Export (optional)
│ │
│ ├── stores/ # Pinia State Management
│ │ └── imageStore.ts # Bild-State-Verwaltung
│ │
│ ├── components/ # Vue-Komponenten
│ │ ├── AppHeader.vue # Header mit Sprach-/Theme-Toggle
│ │ ├── StatusBar.vue # Statusleiste mit Aktionsbuttons
│ │ ├── DropZone.vue # Datei-Upload-Bereich
│ │ ├── ImageGrid.vue # Grid-Layout für Bilder
│ │ ├── ImageCard.vue # Einzelne Bildkarte
│ │ └── LoadingIndicator.vue # Lade-Anzeige
│ │
│ ├── locales/ # i18n Übersetzungen
│ │ ├── de.json # Deutsche Übersetzungen
│ │ └── en.json # Englische Übersetzungen
│ │
│ ├── assets/ # Statische Assets
│ │ └── styles/
│ │ └── main.css # Globale Styles
│ │
│ ├── App.vue # Haupt-App-Komponente
│ └── main.ts # Einstiegspunkt
│
├── index.html # HTML-Template
├── vite.config.ts # Vite-Konfiguration
├── tsconfig.json # TypeScript-Konfiguration
└── package.json # Dependencies
- Node.js >= 18
- npm oder yarn
# Dependencies installieren
npm install
# Development Server starten
npm run dev
# Production Build erstellen
npm run build
# Production Build testen
npm run previewDie src/lib/ Ordnerstruktur enthält die wiederverwendbaren Core-Module, die unabhängig von Vue funktionieren:
- image-processor.ts: Zentrale Bildverarbeitungsklasse mit allen Canvas-Operationen
- types.ts: TypeScript-Typdefinitionen für die gesamte App
- export-pdf.ts: PDF-Export-Funktionalität mit jsPDF
- export-zip.ts: ZIP-Download-Funktionalität mit JSZip
Diese Module können auch in anderen Projekten wiederverwendet werden!
Der imageStore verwaltet den gesamten Bild-State:
import { useImageStore } from '@/stores/imageStore'
const imageStore = useImageStore()
// Bilder hinzufügen
await imageStore.addImage(file)
await imageStore.addImages([file1, file2])
// Auswahl verwalten
imageStore.toggleImageSelection(id)
imageStore.selectAllImages()
// Bilder entfernen
imageStore.removeImage(id)
imageStore.removeSelectedImages()App.vue
├── AppHeader.vue
├── StatusBar.vue
├── DropZone.vue
├── ImageGrid.vue
│ └── ImageCard.vue (mehrfach)
└── LoadingIndicator.vue
Die App unterstützt mehrere Sprachen mit vue-i18n:
import { useI18n } from 'vue-i18n'
const { t, locale } = useI18n()
// Übersetzung verwenden
const title = t('header.title')
// Sprache wechseln
locale.value = 'de' // oder 'en'Übersetzungen befinden sich in src/locales/.
Dark/Light Mode wird über CSS-Variablen gesteuert:
// Theme setzen
document.documentElement.dataset.theme = 'dark' // oder 'light'Alle Theme-Variablen sind in src/assets/styles/main.css definiert.
import { ImageProcessor } from '@/lib/core/image-processor'
import type { ImageObject } from '@/lib/core/types'
// Datei verarbeiten
const imageObj = await ImageProcessor.processFile(file)
// Transformationen
ImageProcessor.rotateImage(imageObj, 90)
ImageProcessor.flipImage(imageObj, 'horizontal')
ImageProcessor.resizeImage(imageObj, 800, 600, true)
// Export
const format = { name: 'PNG', mimeType: 'image/png', ext: 'png' }
const blob = await ImageProcessor.convertToFormat(imageObj, format)import { exportMultipleImagesAsPdf } from '@/lib/features/export-pdf'
const settings = {
title: 'Meine Bilder',
author: 'Max Mustermann',
includeTitlePage: true,
includeCommentPage: true,
includeFileName: true,
optimizeSize: true,
orientation: 'auto' // 'auto' | 'portrait' | 'landscape'
}
await exportMultipleImagesAsPdf(images, settings)- Erstelle eine neue
.vueDatei insrc/components/ - Importiere und verwende sie in einer Parent-Komponente
- Nutze den
imageStorefür State-Zugriff
- Erstelle eine neue
.tsDatei insrc/lib/features/ - Exportiere Funktionen, die unabhängig von Vue sind
- Importiere und verwende sie in Vue-Komponenten
- Füge neue Keys zu
src/locales/de.jsonundsrc/locales/en.jsonhinzu - Verwende
t('key.path')in Komponenten
- Typsicherheit: Verwende TypeScript-Typen aus
src/lib/core/types.ts - State Management: Nutze Pinia für globalen State
- Komponenten-Komposition: Halte Komponenten klein und fokussiert
- Wiederverwendbarkeit: Lagere wiederverwendbare Logik in
src/lib/aus - Performance: Nutze
computedfür berechnete Werte - Accessibility: Verwende semantic HTML und ARIA-Attribute
Alle wichtigen Typen sind in src/lib/core/types.ts definiert:
interface ImageObject {
id: string
file: File
image: HTMLImageElement
canvas: HTMLCanvasElement
ctx: CanvasRenderingContext2D
originalWidth: number
originalHeight: number
selected: boolean
outputName: string
}
interface PdfSettings {
title: string
author: string
includeTitlePage: boolean
includeCommentPage: boolean
includeFileName: boolean
optimizeSize: boolean
orientation: 'auto' | 'portrait' | 'landscape'
// ...
}Contributions sind willkommen! Bitte erstelle einen Pull Request mit:
- Klarer Beschreibung der Änderungen
- Tests (falls zutreffend)
- Aktualisierter Dokumentation
MIT License
- Vue.js Team
- Pinia Team
- jsPDF
- JSZip
- Font Awesome
Entwickelt mit ❤️ und Vue 3
Wenn dir dieses Projekt gefällt und du die Entwicklung unterstützen möchtest, freue ich mich über eine Spende:
Autor: Dinko Ramić - Kodini Tools - kodinitools.com
