2014-04-08 22 views
15

Sto usando il ridimensionamento pacchetto di andare qui: https://github.com/nfnt/resizeGo ridimensionamento delle immagini

1) sto tirando un'immagine da S3, in quanto tale:

 image_data, err := mybucket.Get(key) 
     // this gives me data []byte 

2) Dopo di che, ho bisogno di ridimensionare il immagine:

 new_image := resize.Resize(160, 0, original_image, resize.Lanczos3) 
     // problem is that the original_image has to be of type image.Image 

3) caricare l'immagine al mio secchio S3

 err : = mybucket.Put('newpath', new_image, 'image/jpg', 'aclstring') 
    // problem is that new image needs to be data []byte 

Come trasformare un byte di dati [] in ---> image.Image e tornare a ----> data [] byte ??

Grazie in anticipo per l'aiuto!

risposta

32

Leggi http://golang.org/pkg/image

// you need the image package, and a format package for encoding/decoding 
import (
    "bytes" 
    "image" 
    "image/jpeg" 

    // 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 
+0

impressionante. Qual è il carattere di sottolineatura prima di "image/jpeg"? Inoltre, come è disponibile la variabile byte? Infine, come posso ricodificare in [] byte? Grazie mille –

+3

Il trattino basso è come importi qualcosa solo per i suoi effetti collaterali (registrando il decoder in questo caso). Importa senza il carattere di sottolineatura per usare 'jpeg.Encode'. 'bytes' è un pacchetto nella libreria standard. – JimB

9

vuole farlo 29 times faster? Prova sorprendente vipsthumbnail invece:

sudo apt-get install libvips-tools 
vipsthumbnail --help-all 

Ciò ridimensionerà e ben ritagliare salvare risultato in un file:

vipsthumbnail original.jpg -s 700x200 -o 700x200.jpg -c 

Chiamata da 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

Nei casi in cui le chiamate di sistema non sono auspicabili, esiste anche un [collegamento] (https://github.com/DAddYE/vips). – transistor09

2

si potrebbe usare bimg, che è alimentato per libvips (una veloce libreria di elaborazione delle immagini scritta in C).

Se siete alla ricerca di una soluzione di ridimensionamento delle immagini come un servizio, date un'occhiata al imaginary

Problemi correlati