2014-04-08 7 views
15

Ich bin mit dem die Größe Go-Paket hier: https://github.com/nfnt/resizeGo Resizing Bilder

1) ich ein Bild von S3 bin ziehen, wie zum Beispiel:

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

2) Danach muss ich die Größe ändern Bild:

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

3) Laden Sie das Bild auf meinem S3 Eimer

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

Wie transformiere ich ein Datenbyte in ---> image.Image und zurück zu ----> data [] byte ??

Vielen Dank im Voraus für die Hilfe!

Antwort

32

Lesen 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

Ehrfürchtig suchen. Wofür ist der Unterstrich vor "image/jpeg"? Wie steht mir die Variable Bytes zur Verfügung? Zuletzt, wie kodiere ich zurück in [] Byte? Vielen Dank –

+3

Der Unterstrich ist, wie Sie etwas nur für seine Nebenwirkungen importieren (Registrierung des Decoders in diesem Fall). Importieren Sie ohne den Unterstrich, um 'jpeg.Encode' zu ​​verwenden. 'Bytes' ist ein Paket in der Standardbibliothek. – JimB

9

Will ich haben 29 times faster tun? Versuchen erstaunlich vipsthumbnail statt:

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

Dies wird die Größe und schön zuschneiden Ergebnis in einer Datei speichern:

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

Aufruf von 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

In Fällen, in denen Systemaufrufe unerwünscht sind, gibt es auch eine [Bindung] (https://github.com/DAddYE/vips). – transistor09

2

Sie bimg verwenden könnte, die mit Strom versorgt wird von libvips (eine schnelle Bildverarbeitungsbibliothek in C geschrieben).

Wenn Sie für eine Bildskalierungslösung als Dienstleistung, werfen Sie einen Blick auf imaginary