fix(thumbnails): EXIF-Drehung auswerten, hochkant blieb quer
Kameras speichern die Bildpunkte fast immer quer und legen die Drehung als EXIF-Notiz daneben. Browser befolgen sie von selbst - Go nicht. Deshalb stand dasselbe Foto in der grossen Ansicht aufrecht und lag im Vorschaubild auf der Seite. Neues Paket internal/imageutil liest genau ein Feld (0x0112) aus dem Anfang der Datei und dreht danach. Von Hand statt mit einer Bibliothek: Der Weg dorthin ist kurz und liegt fest, und gebraucht wird ein Feld. Gelesen werden nur die ersten 64 KB, damit ein 40-MB-Foto nicht zweimal im Speicher liegt. Gedreht wird vor dem Verkleinern - andersherum bekaeme ein hochkantes Foto den Zuschnitt eines Querformats. Bestehende Vorschaubilder aendern sich davon nicht. Dafuer neu: POST /admin/thumbnails/rebuild samt Knopf im Admin-Bereich. Auch Profilbilder aus OIDC laufen jetzt durch dieselbe Auswertung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
edefce3572
commit
4bd9a6ca56
10 files changed
+514
-2
No files matched your search
@@ -533,3 +533,29 @@ func isUniqueViolation(err error) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ImageFiles nennt alle nicht gelöschten Dateien, aus denen ein Vorschaubild
|
||||
// entstehen kann – für das Neuerzeugen von Hand.
|
||||
//
|
||||
// Ohne Papierkorb: Für eine Datei, die man weggeworfen hat, lohnt keine Runde
|
||||
// durch den Dekodierer.
|
||||
func (s *Store) ImageFiles(ctx context.Context) ([]*File, error) {
|
||||
rows, err := s.db.Query(ctx,
|
||||
`SELECT `+fileCols+`
|
||||
FROM files
|
||||
WHERE is_deleted = false AND mime_type LIKE 'image/%'
|
||||
ORDER BY created_at`)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("query image files: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
var out []*File
|
||||
for rows.Next() {
|
||||
var f File
|
||||
if err := scanFile(rows, &f); err != nil {
|
||||
return nil, fmt.Errorf("scan image file: %w", err)
|
||||
}
|
||||
out = append(out, &f)
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
Reference in new issue
Block a user