Изменить размер изображений
Я использую пакет Go resize здесь: https://github.com/nfnt/resize
-
Я вытягиваю изображение из S3, как таковое:
image_data, err := mybucket.Get(key)
// this gives me data []byte
-
После этого мне нужно изменить размер изображения:
new_image := resize.Resize(160, 0, original_image, resize.Lanczos3)
// problem is that the original_image has to be of type image.Image
-
Загрузить изображение в мое ведро S3
err : = mybucket.Put('newpath', new_image, 'image/jpg', 'aclstring')
// problem is that new image needs to be data []byte
Как преобразовать []byte
данных []byte
в ---> image.Image
и обратно в []byte
→ data []byte
?
Ответы
Ответ 1
Читать http://golang.org/pkg/image
// you need the image package, and a format package for encoding/decoding
import (
"bytes"
"image"
"image/jpeg"
"github.com/nfnt/resize"
// if you don't need to use jpeg.Encode, import like so:
// _ "image/jpeg"
)
// Decoding gives you an Image.
// If you have an io.Reader already, you can give that to Decode
// without reading it into a []byte.
image, _, err := image.Decode(bytes.NewReader(data))
// check err
newImage := resize.Resize(160, 0, original_image, resize.Lanczos3)
// Encode uses a Writer, use a Buffer if you need the raw []byte
err = jpeg.Encode(someWriter, newImage, nil)
// check err
Ответ 2
Хотите сделать это в 29 раз быстрее? Попробуйте вместо этого vipsthumbnail
:
sudo apt-get install libvips-tools
vipsthumbnail --help-all
Это приведет к изменению размера и хорошему результату сохранения результата в файл:
vipsthumbnail original.jpg -s 700x200 -o 700x200.jpg -c
Вызов из Go:
func resizeExternally(from string, to string, width uint, height uint) error {
var args = []string{
"--size", strconv.FormatUint(uint64(width), 10) + "x" +
strconv.FormatUint(uint64(height), 10),
"--output", to,
"--crop",
from,
}
path, err := exec.LookPath("vipsthumbnail")
if err != nil {
return err
}
cmd := exec.Command(path, args...)
return cmd.Run()
}
Ответ 3
Вы можете использовать bimg, который работает от libvips (быстрая библиотека обработки изображений, написанная на языке C).
Если вы ищете решение для изменения размера изображения в качестве сервиса, посмотрите imaginary