mirror of
https://github.com/IceWhaleTech/CasaOS.git
synced 2025-06-16 05:55:33 +00:00
- [Apps] This is a feature that has been highly requested by the community. Import the original Docker application into CasaOS. Now it's easy to import with just a few clicks! - [Apps] App list supports a custom sorting function! You can arrange apps in different orders by dragging the icons. - [Apps] App custom installation supports Docker Compose configuration import in YAML format. - [Files] Added thumbnail preview function for image files. - [Connect] Multiple CasaConenct devices in the LAN will be transmitted through the LAN network. - [System] Added a switch for auto-mounting USB disk devices. 🎈 Enhancement - [System] Optimized the system update alert, you will see the new version update log from the next version. - [Apps] Added live preview for icons in custom installed apps. - [Apps] Optimized the input of WebUI. - [Files] Completely updated the image preview, now it supports switching all images in the same folder, as well as dragging, zooming, rotating and resetting. - [Widgets] Added color levels for CPU and RAM charts. - [Conenct] Optimized the display of the right-click menu of the Connect friends list. 🎈 Changed - [Files] Change the initial display directory to /DATA 🐞 Fixed - [System] Fixed an issue with Raspberry Pi devices failing to boot using USB disks. (Achieved by disabling USB disk auto-mount) - [Apps] Fixed the issue that some Docker CLI commands failed to import. - [Apps] Fixed the issue that the app is not easily recognized in /DATA/AppData directory and docker command line after installation, it will be shown as the app name. (Newly installed apps only) - [Apps] Fixed the issue that Pi-hole cannot be launched after installation in the app store. - [Apps] Fixed the issue that apps cannot be updated with WatchTower. - [Files] Fixed the issue that when there is an upload task, the task status is lost after closing Files.
85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package file
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/disintegration/imaging"
|
|
"github.com/dsoprea/go-exif/v3"
|
|
exifcommon "github.com/dsoprea/go-exif/v3/common"
|
|
)
|
|
|
|
func GetImage(path string, width, height int) ([]byte, error) {
|
|
if thumbnail, err := GetThumbnailByOwnerPhotos(path); err == nil {
|
|
return thumbnail, nil
|
|
} else {
|
|
return GetThumbnailByWebPhoto(path, width, height)
|
|
}
|
|
}
|
|
func GetThumbnailByOwnerPhotos(path string) ([]byte, error) {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
buff := &bytes.Buffer{}
|
|
|
|
defer file.Close()
|
|
offset := 0
|
|
offsets := []int{12, 30}
|
|
|
|
head := make([]byte, 0xffff)
|
|
|
|
r := io.TeeReader(file, buff)
|
|
_, err = r.Read(head)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, offset = range offsets {
|
|
if _, err = exif.ParseExifHeader(head[offset:]); err == nil {
|
|
break
|
|
}
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
im, err := exifcommon.NewIfdMappingWithStandard()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, index, err := exif.Collect(im, exif.NewTagIndex(), head[offset:])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ifd := index.RootIfd.NextIfd()
|
|
if ifd == nil {
|
|
return nil, exif.ErrNoThumbnail
|
|
}
|
|
thumbnail, err := ifd.Thumbnail()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return thumbnail, nil
|
|
}
|
|
func GetThumbnailByWebPhoto(path string, width, height int) ([]byte, error) {
|
|
src, err := imaging.Open(path)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return nil, err
|
|
}
|
|
|
|
img := imaging.Resize(src, width, 0, imaging.Lanczos)
|
|
|
|
f, err := imaging.FormatFromFilename(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
buf := bytes.Buffer{}
|
|
imaging.Encode(&buf, img, f)
|
|
return buf.Bytes(), nil
|
|
}
|